スコープ固有の ID を使用してブロックにマークを付ける。
ループ・ブロッキングが発生するには、#pragma block_loop ディレクティブが for ループに先行している必要があります。
ブロッキング・ループに #pragma unroll、#pragma unrollandfuse、または #pragma stream_unroll を指定すると、ブロッキング・ループが実際に作成された場合、ブロッキング・ループがそれぞれアンロール、アンロールおよびヒューズ、またはストリーム・アンロールされます。それ以外の場合、このディレクティブは何の効果もありません。
ブロックされたループに #pragma unrollandfuse、#pragma unroll、または #pragma stream_unroll ディレクティブを指定すると、ディレクティブはブロッキング・ループの作成後に、ブロックされたループに適用されます。ブロッキング・ループが作成されないと、対応する #pragma block_loop ディレクティブが指定されていないかのように、このディレクティブがブロッキングを意図したループに適用されます。
同じ for ループに対して #pragma block_loop を複数回指定したり、このディレクティブを #pragma nounroll、#pragma unroll、#pragma nounrollandfuse、#pragma unrollandfuse、または #pragma stream_unroll ディレクティブと結合しないでください。また、単一のブロック・ループ・ディレクティブに複数の #pragma unroll ディレクティブを適用しないでください。
すべての #pragma block_loop ディレクティブの処理は常に、いずれかの unroll ディレクティブによって示されるアンロールの実行前に完了します。
#pragma block_loop(50, mymainloop)
#pragma block_loop(20, myfirstloop, mysecondloop)
#pragma loopid(mymainloop)
for (i=0; i < n; i++)
{
#pragma loopid(myfirstloop)
for (j=0; j < m; j++)
{
#pragma loopid(mysecondloop)
for (k=0; k < m; k++)
{
...
}
}
}
#pragma block_loop(50, mymainloop)
#pragma block_loop(20, myfirstloop, mysecondloop)
#pragma loopid(mymainloop)
for (i=0; i < n; n++)
{
#pragma loopid(myfirstloop)
for (j=0; j < m; j++)
{
#pragma loopid(mysecondloop)
for (k=0; k < m; k++)
{
...
}
}
}
for (i=0; i < n; i++)
{
for (j=0; j < n; j++)
{
#pragma block_loop(1,myloop1)
for (k=0; k < m; k++)
{
#pragma loopid(myloop1)
for (l=0; l < m; l++)
{
...
}
}
}
}
#pragma block_loop(l3factor, first_level_blocking)
for (i=0; i < n; i++)
{
#pragma loopid(first_level_blocking)
#pragma block_loop(l2factor, inner_space)
for (j=0; j < n; j++)
{
#pragma loopid(inner_space)
for (k=0; k < m; k++)
{
for (l=0; l < m; l++)
{
...
}
}
}
}
#pragma unrollandfuse
#pragma block_loop(10)
for (i = 0; i < N; ++i) {
}
この場合、ブロック・ループ・ディレクティブが無視されると、アンロール・ディレクティブは何の効果も及ぼしません。 #pragma block_loop(10)
#pragma unroll(2)
for (i = 0; i < N; ++i) {
}
この場合、ブロック・ループ・ディレクティブが無視されても、非ブロック化されたループはアンロールされます。ブロッキングが発生した場合は、アンロール・ディレクティブはブロックされたループに適用されます。 #pragma block_loop(50, myloop)
for (i=0; i < n; i++)
{
}
myloop は、ネスト内になく定義されない場合があるため、参照できません。 for (i=0; i < n; i++)
{
#pragma loopid(myLoop)
for (j=0; j < i; j++)
{
...
}
}
#pragma block_loop(myLoop)
for (i=0; i < n; i++)
{
...
}
#pragma unrollandfuse(5)
#pragma unroll(2)
#pragma block_loop(10)
for (i = 0; i < N; ++i) {
}
#pragma block_loop(10)
#pragma unroll(5)
#pragma unroll(10)
for (i = 0; i < N; ++i) {
}