我是opencl的新手,我想实际并行化这个Sieve Prime,C ++代码在这里:https://www.geeksforgeeks.org/sieve-of-atkin/
我不知道从中得到了什么好结果,实际上CPU版本在比较之后要快得多。我试图使用NDRangekernel来避免编写嵌套循环并可能提高性能但是当我在函数中给出更高的限制数时,GPU驱动程序停止响应并且程序崩溃。也许我的NDRangekernel配置不行,任何人都可以帮忙吗?我可能没有正确地获得NDRange,这是关于我的GPU的信息。
CL_DEVICE_MAX_WRITE_IMAGE_ARGS:16
这是我的NDRange代码
queue.enqueueNDRangeKernel(add,cl :: NDRange(1,1),cl :: NDRange((limit * limit)-1,(limit * limit)-1),cl :: NullRange,NULL,&事件);
和我的内核代码:
__kernel void sieveofAktin(const int limit, __global bool* sieve)
{
int x = get_global_id(0);
int y = get_global_id(1);
//printf("%d \n", x);
int n = (4 * x * x) + (y * y);
if (n <= limit && (n % 12 == 1 || n % 12 == 5))
sieve[n] ^= true;
n = (3 * x * x) + (y * y);
if (n <= limit && n % 12 == 7)
sieve[n] ^= true;
n = (3 * x * x) - (y * y);
if (x > y && n <= limit && n % 12 == 11)
sieve[n] ^= true;
for (int r = 5; r * r < limit; r++) {
if (sieve[r]) {
for (int i = r * r; i < limit; i += r * r)
sieve[i] = false;
}
}
}
答案 0 :(得分:1)
您在该代码中有批次分支,我怀疑这可能会破坏您在GPU上的性能。请查看http://example.com/pypi/packages的第6章,了解为何会影响性能的详细信息。
如果不仔细查看算法,我不确定它是多么可能,但理想情况下,您希望重写代码以尽可能少地使用分支。或者,您可以完全查看其他算法。
至于锁定,我需要查看更多主机代码才能知道发生了什么,但是你可能超出了平台/设备的各种限制。您是否在调用每个OpenCL函数时检查错误?
答案 1 :(得分:1)
无论您的算法或实现有多好或坏 - 驱动程序应始终响应。不答复很可能是一个错误。在http://developer.nvidia.com/提交错误报告。