我正在使用 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。