Opencl 背包算法:gpu上pown()的奇怪行为
CPU OCL上的版本产生正确的结果,其中GPU OCL在某些地方给出的结果稍有不同,这毕竟会影响结果的正确性。我在英特尔OCL SDK上进行了调试,得到了正确的结果。我没有发现任何竞争条件或对内存的并发访问。在我引入内核(一行代码)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
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.