1

私はOpenCLの世界に慣れていないので、OpenCLについての知識を増やしたいと思います。

OpenCLを使用して「複雑な関数」を構築する方法についての情報を見つけようとしました。「複雑な関数」とは、並列化できる関数であり、内部にも並列化できる関数があることを意味します。私は次のようなリンクを見てきました:

そして今、私は私の質問に行きます、私は例を使うつもりです:

// A and B are int vectors
// The value of M and N are different!! M != N
for(int i=0; i<=M-2;i++){
  for(int j=i+1;j<=M-1;j++){
    distance=calculate_distance(A[i],B[j]);
    //more sequential instructions
  }
}

そして、calculate_distanceは両方のベクトルを連結し、ループを持っています。

for(int i=0; i<=N-1;i++)
  // Some sequential instructions

このコードの完全な断片を並列化できますか?その場合、どのように(これがカーネル内のタイトルカーネルの理由です)?

注:カーネルをチェックするために、OpenCL用のインテル(R)SDK-オフラインコンパイラ2012(Windows)を使用しています。

前もって感謝します

4

2 に答える 2

1

並列コードを作成するには、データフローにさらに注意を払う必要があります。入力データはどのように見えますか?出力データはどのように見えますか?入力データを出力データにどのように変換しますか?

あなたの質問について:

  • データフローが明確でないため、提供した例が並列化可能かどうかを判断することはできません。
  • カーネルコードから関数を呼び出すことができ、それらはカーネルにインライン化されます。

ヒント:

また、C / C ++ forループのCUDAへの変換も確認してください。これはOpenCLではなくCUDAですが、原則は似ています。

出力データが単一の値(最大距離など)である場合は、リダクションカーネルを調べて、それらがどのように機能するかを理解することをお勧めします。

于 2013-01-03T14:50:37.863 に答える
-1

関数を再入可能にします。

于 2013-01-03T14:08:15.903 に答える