私は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];
__attribute __(opencl_unroll_hint(n)))を試しましたか? https://www.khronos.org/registry/OpenCL/specs/opencl-2.0-openclc.pdf –
これを試してみると、助けにならない。 –
手動アンローリングを試しましたか? –