0

我正在使用 OpenCL 研究算法,我需要测量它在并行和顺序版本中的执行时间。因此,我使用外部循环来迭代这两个代码并测量它们的时间,但我得到了:

顺序:3.06 段

并行:269 段

我用于并行版本的代码是:

t_start=clock();                 /* Start measuring time */

for(i=0;i<=N; i++) // N is really big, around a million, but is the same for both versions
{

fitness = 0;

ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global_item_size, NULL, 0, NULL, NULL);

ret = clEnqueueReadBuffer(command_queue, vdistance, CL_TRUE, 0, siz_mem_distance_code, distance_code, 0, NULL, NULL);

ret = clEnqueueReadBuffer(command_queue, vsumatorio, CL_TRUE, 0,siz_mem_sumatorio, sumatorio, 0, NULL, NULL);

fitness = (1/(*sumatorio)) + (*distance_code/12) + ((pow(*distance_code,2))/4) + ((pow(*distance_code,3))/6);

}

t_finish=clock();                 /* End measuring time */

在这段代码之前,我已经创建/初始化了使用 OpenCL 运行程序所需的所有东西(平台、设备、上下文、队列、缓冲区、内核……),在这段代码之后,我释放了所有东西。我已经检查过这种时间的增加是由于在每次迭代中都读取了两个变量(distance_code 和 sumatorio),但我必须这样做,因为我必须获得适合度值,这是一个顺序指令,并且只能在内核具有完成了,所以...你能帮帮我吗?我究竟做错了什么?

我希望能正确解释自己,在此先感谢。

注意:我只使用 CPU。

4

1 回答 1

1

启动这么多内核的开销超过了仅对 64 个数据项并行化 for 循环的好处。您需要重写您的问题,以便在大批量数据上启动相对较少的内核。在这种情况下,如果 OpenCL 编译器生成了适当的向量化机器代码,您会看到对顺序版本的改进。

此外,如果生成的代码包含任何向量指令,您应该检查AMD 的 CodeXL或 Intel 的离线编译器。

于 2013-01-18T07:53:04.017 回答