Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL作为通用C运行时编译器(为什么CPU上的内核比直接C慢?)_Opencl - Fatal编程技术网

OpenCL作为通用C运行时编译器(为什么CPU上的内核比直接C慢?)

OpenCL作为通用C运行时编译器(为什么CPU上的内核比直接C慢?),opencl,Opencl,我一直在使用openCL作为执行运行时C代码的通用方法。虽然我对让代码最终在GPU上运行很感兴趣,但我目前正在研究与直接运行C相比OpenCL在CPU上的开销 显然,在OpenCL中准备和编译内核会有开销。但即使我只是对最终执行和缓冲区读取计时: clEnqueueNDRangeKernel(...); clFinish(); clEnqueueReadBuffer(...); 与直接的C代码(系数30)相比,简单计算的开销很大,即使有1000个循环,也给了它并行化的机会。显然,从OpenCL

我一直在使用openCL作为执行运行时C代码的通用方法。虽然我对让代码最终在GPU上运行很感兴趣,但我目前正在研究与直接运行C相比OpenCL在CPU上的开销

显然,在OpenCL中准备和编译内核会有开销。但即使我只是对最终执行和缓冲区读取计时:

clEnqueueNDRangeKernel(...);
clFinish();
clEnqueueReadBuffer(...);
与直接的C代码(系数30)相比,简单计算的开销很大,即使有1000个循环,也给了它并行化的机会。显然,从OpenCL代码读回缓冲区会有开销。。。但是它位于同一个CPU上,所以不会有那么大的开销


这听起来对吗

clenqueueradbuffer()
的调用很可能执行类似于
memcpy
的操作,该操作成本高且非最优

如果要避免这种情况,您应该在主机上正常分配数据(例如使用
malloc()
new
),并在创建OpenCL缓冲区对象时将
CL\u MEM\u USE\u host\u PTR
标志传递给
clCreateBuffer()
。然后使用
ClenqueueEmapBuffer()
ClenqueuenmapMemObject()
将数据传递到OpenCL或从OpenCL传递数据,而不实际执行复制。这应该接近最佳的水资源利用率,以最小化OpenCL开销

对于实现此技术的更高级别抽象,请查看中的类(简单示例)