我正在使用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。
答案 0 :(得分:1)
启动这么多内核的开销超过了仅在64个数据项上并行化for循环的好处。您需要重写您的问题,以便在大批量数据上启动相对较少的内核。在这种情况下,如果OpenCL编译器生成了适当的矢量化机器代码,您会看到对顺序版本的改进。
此外,如果生成的代码包含任何向量说明,则应与AMD's CodeXL或英特尔Offline Compiler核对。