OpenCL,这是正常的执行时间吗?

时间:2013-01-17 14:27:58

标签: gcc ubuntu opencl cpu

我正在使用OpenCL进行算法,我需要在其并行和顺序版本中测量它的执行时间。因此,我使用外部循环迭代两个代码并测量它们的时间,但我已经获得:

顺序:3.06 segs

平行:269 segs

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

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运行程序所需的所有东西(平台,devide,上下文,队列,缓冲区,内核......),在此代码之后,我发布了一切。 我已经检查过这个时间的增加是由于在每次迭代中读取了两个变量(distance_code和sumatorio)但我必须这样做,因为我必须获得适应值,这是一个顺序指令,并且只有在内核有时才能执行完了,所以......你能帮帮我吗?我做错了什么?

我希望能够提前解释自己,先谢谢。

注意:我只使用CPU。

1 个答案:

答案 0 :(得分:1)

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

此外,如果生成的代码包含任何向量说明,则应与AMD's CodeXL或英特尔Offline Compiler核对。