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
ですか?
a
、b
、および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 配列表記を使用して加算を実行し、値をベクターにコピーして戻すことができます。これはおそらく、元の要素ごとの追加を行うよりもコストがかかります。