0

私はそのようなものを持っています:

  for (b=from; b<to; b++) 
  {
    for (a=from2; a<to2; a++) 
    {
      dest->ac[b] += srcvec->ac[a] * srcmatrix->weight[a+(b+from)*matrix_width];
    }
  }

cilkを使って並列化したい。私は次のコードを書きました:

for ( b=from; b<to; b++) 
{
  dest->ac[b] =+  __sec_reduce_add(srcvec->ac[from2:to2-from2] * (srcmatrix->weight+(b*matrix_width))[from2:to2-from2]);
}

しかし、問題は、プライマリ ループで cilk_for を使用することもできますが、reduce 操作が既にスレッドを生成している場合、cilk_for はスレッドのオーバーヘッドを増加させ、全体の速度を低下させないのでしょうか? また、コンパイラをさらに支援するために、 destおよびsrc args にrestrictを追加する必要がありますか? または、この場合は暗黙的ですか?

(ps: という理由で、今はコードを試すことができません

内部コンパイラ エラー: c-family/array-notation-common.c:244 の find_rank 内

の上

neu1b->ac[0:layer1_size]=neu1->ac[0:layer1_size];

私も解決しようとしています。)

4

1 に答える 1

1

restrict暗黙的にそうではありません。さらに、Cilk はワークスティーリングの概念を使用して実装されています。Cilk は、余分な作業のために余分なスレッドを生成するとは限りません。これは、ワーク スタックでタスクをプッシュすることで機能します。内部動作に関する詳細情報は、Cilk FAQにあります。Intel コンパイラは、Cilk を使用した GCC とは異なる処理を行う場合があります。Intel vTune と Intel ベクトル化レポートは、パフォーマンスの違いを測定し、SIMD にコンパイルされているかどうかを示すのに役立ちます。Intel コンパイラを使用すると、次のように SIMD 演算を示すこともできます。

#pragma simdあなたのループの上

また

配列表記: a[:] = b[:] + c[:]ベクトル化された配列演算をプログラムします。

于 2015-08-14T12:43:30.810 に答える