Opencl 背包算法:gpu上pown()的奇怪行为

Opencl 背包算法:gpu上pown()的奇怪行为,opencl,Opencl,CPU OCL上的版本产生正确的结果,其中GPU OCL在某些地方给出的结果稍有不同,这毕竟会影响结果的正确性。我在英特尔OCL SDK上进行了调试,得到了正确的结果。我没有发现任何竞争条件或对内存的并发访问。在我引入内核(一行代码)pown函数之后,这个问题就出现了 void kernel knapsack(global int *input_f, global int *output_f, global uint *m_d, int cmax, int weightk, int pk, i

CPU OCL上的版本产生正确的结果,其中GPU OCL在某些地方给出的结果稍有不同,这毕竟会影响结果的正确性。我在英特尔OCL SDK上进行了调试,得到了正确的结果。我没有发现任何竞争条件或对内存的并发访问。在我引入内核(一行代码)pown函数之后,这个问题就出现了

void kernel knapsack(global int *input_f, global int *output_f, global uint *m_d,  int cmax, int weightk, int pk, int maxelem, int i){

int c = get_global_id(0)+cmax;

if(get_global_id(0)<maxelem){
    if(input_f[c] < input_f[c - weightk] + pk){
        output_f[c] = input_f[c - weightk] + pk;
        m_d[c-1] = pown(2.0,i); *//previous version: m_d[c-1] = 1;*
    } 
    else{
    output_f[c] = input_f[c];

    }   
 }
}
在gpu上,我得到如下信息:

    2^0+2^2, 2^1, 2^0+2^2, 2^1  in the 
    3rd column I access to pown one more again, when I'm not supposed to. 
这给了我“轻微”不同的结果。

这项工作基于这篇文章

  • 相关工作:

您能给我们举一些“结果略有不同”的例子吗。这些可能是(隐藏的)十进制计算(特别是在
pown()
中)导致的舍入错误吗?请尝试使用
1在CPU上执行上述示例,其中CPU将包含:5,2,1,2,其中GPU:5,2,5!(而不是1),2我使用的是OCL 1.2。未定义按位操作。
    2^0+2^2, 2^1, 2^0+2^2, 2^1  in the 
    3rd column I access to pown one more again, when I'm not supposed to.