2017-01-27 11 views
1

私はOpenClコードに#pragma unroll#pragma unroll <loop count>を追加しようとしましたが、待ち時間の改善は見られません。ループ内のステートメントは独立しており、並列に実行する必要があります。だから、私はOpenCLが暗黙的にループをアンロールしているかどうかを知りたいし、アンロールプラグマを追加することは役に立たない。私のコードのOpenCLの "ループ展開"は暗黙的か明示的か?

パートは私がOpenCLの2.0を使用しています。この

for(j = 0; j < 4; j++) 
{ 
    m[0][j] = p0[j] + p0[j+4]; 
    m[0][j+4] = p0[j] - p0[j+4]; 
    m[1][j] = p1[j] + p1[j+4]; 
    m[1][j+4] = p1[j] - p1[j+4]; 
    m[2][j] = p2[j] + p2[j+4]; 
    m[2][j+4] = p2[j] - p2[j+4]; 
    m[3][j] = p3[j] + p3[j+4]; 
    m[3][j+4] = p3[j] - p3[j+4]; 
} 

のようなものです。

手動アンロール後のコードでは、最高のパフォーマンスを持っているために再発注命令をアンロールではなく、この

m[0][0] = p0[0] + p0[0+4]; 
m[0][0+4] = p0[0] - p0[0+4]; 
m[1][0] = p1[0] + p1[0+4]; 
m[1][0+4] = p1[0] - p1[0+4]; 
m[2][0] = p2[0] + p2[0+4]; 
m[2][0+4] = p2[0] - p2[0+4]; 
m[3][0] = p3[0] + p3[0+4]; 
m[3][0+4] = p3[0] - p3[0+4]; 

m[0][1] = p0[1] + p0[1+4]; 
m[0][1+4] = p0[1] - p0[1+4]; 
m[1][1] = p1[1] + p1[1+4]; 
m[1][1+4] = p1[1] - p1[1+4]; 
m[2][1] = p2[1] + p2[1+4]; 
m[2][1+4] = p2[1] - p2[1+4]; 
m[3][1] = p3[1] + p3[1+4]; 
m[3][1+4] = p3[1] - p3[1+4]; 

m[0][2] = p0[2] + p0[2+4]; 
m[0][2+4] = p0[2] - p0[2+4]; 
m[1][2] = p1[2] + p1[2+4]; 
m[1][2+4] = p1[2] - p1[2+4]; 
m[2][2] = p2[2] + p2[2+4]; 
m[2][2+4] = p2[2] - p2[2+4]; 
m[3][2] = p3[2] + p3[2+4]; 
m[3][2+4] = p3[2] - p3[2+4]; 

m[0][3] = p0[3] + p0[3+4]; 
m[0][3+4] = p0[3] - p0[3+4]; 
m[1][3] = p1[3] + p1[3+4]; 
m[1][3+4] = p1[3] - p1[3+4]; 
m[2][3] = p2[3] + p2[3+4]; 
m[2][3+4] = p2[3] - p2[3+4]; 
m[3][3] = p3[3] + p3[3+4]; 
m[3][3+4] = p3[3] - p3[3+4]; 
+0

__attribute __(opencl_unroll_hint(n)))を試しましたか? https://www.khronos.org/registry/OpenCL/specs/opencl-2.0-openclc.pdf –

+0

これを試してみると、助けにならない。 –

+1

手動アンローリングを試しましたか? –

答えて

1

おそらくコンパイラのようなものです。

おそらく、命令レベルの並列処理やパイプラインの作成ではありません。

多分、それはメモリアクセスパターンに関するものです。

ただ、コンパイラの不能または再順序付け命令の場合には、ここでの例は次のとおりです。

m[0][0] = p0[0] + p0[0+4]; 
m[0][1] = p0[1] + p0[1+4]; 
m[0][2] = p0[2] + p0[2+4]; 
m[0][3] = p0[3] + p0[3+4]; 
... 

と再:それはこのために失敗した場合

m[0][0] = p0[0] + p0[0+4]; <---- contiguous addr = x 
m[0][0+4] = p0[0] - p0[0+4]; 
m[1][0] = p1[0] + p1[0+4]; 
m[1][0+4] = p1[0] - p1[0+4]; 
m[2][0] = p2[0] + p2[0+4]; 
m[2][0+4] = p2[0] - p2[0+4]; 
m[3][0] = p3[0] + p3[0+4]; 
m[3][0+4] = p3[0] - p3[0+4]; 

m[0][1] = p0[1] + p0[1+4]; <---- contiguous addr = x+1 
m[0][1+4] = p0[1] - p0[1+4]; 
m[1][1] = p1[1] + p1[1+4]; 
m[1][1+4] = p1[1] - p1[1+4]; 
m[2][1] = p2[1] + p2[1+4]; 
m[2][1+4] = p2[1] - p2[1+4]; 
m[3][1] = p3[1] + p3[1+4]; 
m[3][1+4] = p3[1] - p3[1+4]; 

m[0][2] = p0[2] + p0[2+4]; <---- contiguous addr = x+2 
m[0][2+4] = p0[2] - p0[2+4]; 
m[1][2] = p1[2] + p1[2+4]; 
m[1][2+4] = p1[2] - p1[2+4]; 
m[2][2] = p2[2] + p2[2+4]; 
m[2][2+4] = p2[2] - p2[2+4]; 
m[3][2] = p3[2] + p3[2+4]; 
m[3][2+4] = p3[2] - p3[2+4]; 

m[0][3] = p0[3] + p0[3+4]; <---- contiguous addr = x+3 
m[0][3+4] = p0[3] - p0[3+4]; 
m[1][3] = p1[3] + p1[3+4]; 
m[1][3+4] = p1[3] - p1[3+4]; 
m[2][3] = p2[3] + p2[3+4]; 
m[2][3+4] = p2[3] - p2[3+4]; 
m[3][3] = p3[3] + p3[3+4]; 
m[3][3+4] = p3[3] - p3[3+4]; 

ので、あなたはこれを試すことができます残りの配列もすべて同じように配列されているので、memアクセスが優れています。しかし、私はそれが行のメジャーまたは列メジャーデバイスに応じて可能性があるので、私はm配列についてはわからない。

関連する問題