2

C++ の Cilk Plus 拡張機能 (gcc 上) を使用した並列プログラミングについて学んでいます。私が読んだ中で最も単純なリファクタリングの 1 つは、Cilk 配列表記を使用することです。つまり、順序に依存しないベクトル操作を実行することです。

すなわち:c[:] = a[:] + b[:]

それよりも:for (unsigned i = 0; i < a.size(); ++i) c[i] = a[i] + b[i];

std::vector配列ではなくオブジェクトを多用する大きなコードを配置しています。この概念を で使用することは可能std::vectorですか?

ab、およびcが等しい長さであることを考慮して、std::vector<double>これらを試してみましたが成功しませんでした。

1.

c[:] = a[:] + b[:]

2.

double* aArr = &a[0];
double* bArr = &b[0];
double* cArr = &c[0];
cArr[:] = aArr[:] + bArr[:]

両方とも戻る

ポインターまたはレコードで配列表記を使用するために必要な開始インデックスおよび長さフィールド

アプローチ #2 が長さ情報なしでベクトルへのポインターを作成することは理解していますが、回避策はありますか?

編集:

効率的なソリューションが優先されます。たとえば、配列を定義しstd::copyてベクターから配列に値をコピーし、Cilk 配列表記を使用して加算を実行し、値をベクターにコピーして戻すことができます。これはおそらく、元の要素ごとの追加を行うよりもコストがかかります。

4

1 に答える 1

0

これは最善/最もエレガントな答えではないかもしれません (代替案がある場合は投稿してください) が、インデックスの開始/長さの指定で上記のアプローチ #2 を使用するとうまくいくようです。このような:

double* aArr = &a[0];
double* bArr = &b[0];
double* cArr = &c[0];
cArr[0:c.size()] = aArr[0:c.size()] + bArr[0:c.size()]

もちろん、ベクトルの長さが一致するように注意する必要がありますが、コンパイルすると、これまでのところ同じ答えが返されるようです。

于 2015-10-21T18:18:32.337 に答える