1

我正在编写一个 openCL 代码,以使用 BFS 在图中查找从每个节点到其他节点的最短路径。(这是我正在做的事情的详细信息: BFS 的最短路径,将代码从 CUDA 移植到 openCL

这就是我如何拆分数据以传递给 clEnqueueNDRangeKernel

size_t global_size, local_size;
local_size=1024;
global_size=ceil(e_count/(float)local_size)*local_size;
cl_event sync1;
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, 
    &global_size, &local_size, 0, NULL, &sync1); //wait for this to finish (to synchronize);

错误 = clWaitForEvents(1, &sync1)

该代码适用于边数 <= 50000(比其等效的 cpu 版本慢得多)。当我增加边数时,程序刚刚退出并给出错误-58(在 clEnqueueNDRangeKernel 之后)

我正在使用 NVIDIA Geforce 630M。

我怎样才能弄清楚发生了什么以及如何解决问题?

最好的祝福

4

1 回答 1

3

错误 -58 是一个 CL_INVALID_EVENT(如您在cl.h中看到的),它不是由clEnqueueNDRangeKernel返回的,仅由clWaitForEvents 返回。所以你可能只检查后一个函数的错误。为了找出实际的错误是什么,您应该检查返回值clEnqueueNDRangeKernel与它可以返回的不同状态常量。事实上,您应该对所有主机 OpenCL 函数执行此操作,否则将很难准确确定正在发生的错误类型。

在这种特定情况下,我敢打赌您遇到了与内存相关的错误,例如 CL_OUT_OF_RESOURCES(没有足够的本地或私有内存供您的内核使用)。

希望这可以帮助。

于 2012-12-31T19:52:39.113 回答