在 OpenCL 中哪个更有效:if 条件还是 for 循环?
Which is more efficient in OpenCL: if conditions or for loops?
我有一段这样的OpenCL代码
if (Sum[0] < Best)
{
Best = Sum[0];
iBest = 1;
*aBits = Bits[0];
}
if (Sum[1] < Best)
{
Best = Sum[1];
iBest = 2;
*aBits = Bits[1];
}
if (Sum[2] < Best)
{
Best = Sum[2];
iBest = 3;
*aBits = Bits[2];
}
if (Sum[3] < Best)
{
Best = Sum[3];
iBest = 4;
*aBits = Bits[3];
}
if (Sum[4] < Best)
{
Best = Sum[4];
iBest = 5;
*aBits = Bits[4];
}
if (Sum[5] < Best)
{
Best = Sum[5];
iBest = 6;
*aBits = Bits[5];
}
if (Sum[6] < Best)
{
Best = Sum[6];
iBest = 7;
*aBits = Bits[6];
}
if (Sum[7] < Best)
{
Best = Sum[7];
iBest = 8;
*aBits = Bits[7];
}
为了减少逻辑,我把代码重写成这样
for(i = 1; i < 8; i++)
{
if(Sum[i] < Sum[index])
index = i;
}
if (Sum[index] < Best)
{
Best = Sum[index];
iBest = index + 1;
*aBits = Bits[index];
}
但是,在第二种情况下,延迟增加了大约 20%。任何人都可以提供对这种行为的任何见解吗? if conditions
编码风格是否比 OpenCL 中的 for loops
更有效?
我使用的是 Intel 530 (Gen9) GPU。我正在使用内存映射访问。
第一种情况对 GPU 不利。因为它强制当其中一个工作项进入 if 条件时,所有工作项都会执行。
如果你期望随机进入"if"条件,最后所有的指令都被执行并且比第二种情况多
而在第二种情况下,"if" 中的 GPU 指令较少,只有一行。并且所有工作项同时进入最后一节。
对于 CPU 第一种情况最好,因为不需要保存索引然后再查找。
无论如何,避免double/tripple读取全局内存上的变量。因为那些没有被编译器优化(除非标记为 read_only)。这段代码应该比你写的快得多:
int best_sum = Sum[index]; //Private, fast access
for(i = 1; i < 8; i++)
{
int sum = Sum[i]; //Again private
if(sum < best_sum){
index = i;
best_sum = sum;
}
}
if (best_sum < Best)
{
Best = best_sum;
iBest = index + 1;
*aBits = Bits[index];
}
我有一段这样的OpenCL代码
if (Sum[0] < Best)
{
Best = Sum[0];
iBest = 1;
*aBits = Bits[0];
}
if (Sum[1] < Best)
{
Best = Sum[1];
iBest = 2;
*aBits = Bits[1];
}
if (Sum[2] < Best)
{
Best = Sum[2];
iBest = 3;
*aBits = Bits[2];
}
if (Sum[3] < Best)
{
Best = Sum[3];
iBest = 4;
*aBits = Bits[3];
}
if (Sum[4] < Best)
{
Best = Sum[4];
iBest = 5;
*aBits = Bits[4];
}
if (Sum[5] < Best)
{
Best = Sum[5];
iBest = 6;
*aBits = Bits[5];
}
if (Sum[6] < Best)
{
Best = Sum[6];
iBest = 7;
*aBits = Bits[6];
}
if (Sum[7] < Best)
{
Best = Sum[7];
iBest = 8;
*aBits = Bits[7];
}
为了减少逻辑,我把代码重写成这样
for(i = 1; i < 8; i++)
{
if(Sum[i] < Sum[index])
index = i;
}
if (Sum[index] < Best)
{
Best = Sum[index];
iBest = index + 1;
*aBits = Bits[index];
}
但是,在第二种情况下,延迟增加了大约 20%。任何人都可以提供对这种行为的任何见解吗? if conditions
编码风格是否比 OpenCL 中的 for loops
更有效?
我使用的是 Intel 530 (Gen9) GPU。我正在使用内存映射访问。
第一种情况对 GPU 不利。因为它强制当其中一个工作项进入 if 条件时,所有工作项都会执行。 如果你期望随机进入"if"条件,最后所有的指令都被执行并且比第二种情况多
而在第二种情况下,"if" 中的 GPU 指令较少,只有一行。并且所有工作项同时进入最后一节。
对于 CPU 第一种情况最好,因为不需要保存索引然后再查找。
无论如何,避免double/tripple读取全局内存上的变量。因为那些没有被编译器优化(除非标记为 read_only)。这段代码应该比你写的快得多:
int best_sum = Sum[index]; //Private, fast access
for(i = 1; i < 8; i++)
{
int sum = Sum[i]; //Again private
if(sum < best_sum){
index = i;
best_sum = sum;
}
}
if (best_sum < Best)
{
Best = best_sum;
iBest = index + 1;
*aBits = Bits[index];
}