OpenCL作为通用C运行时编译器(为什么CPU上的内核比直接C慢?)
我一直在使用openCL作为执行运行时C代码的通用方法。虽然我对让代码最终在GPU上运行很感兴趣,但我目前正在研究与直接运行C相比OpenCL在CPU上的开销 显然,在OpenCL中准备和编译内核会有开销。但即使我只是对最终执行和缓冲区读取计时:OpenCL作为通用C运行时编译器(为什么CPU上的内核比直接C慢?),opencl,Opencl,我一直在使用openCL作为执行运行时C代码的通用方法。虽然我对让代码最终在GPU上运行很感兴趣,但我目前正在研究与直接运行C相比OpenCL在CPU上的开销 显然,在OpenCL中准备和编译内核会有开销。但即使我只是对最终执行和缓冲区读取计时: clEnqueueNDRangeKernel(...); clFinish(); clEnqueueReadBuffer(...); 与直接的C代码(系数30)相比,简单计算的开销很大,即使有1000个循环,也给了它并行化的机会。显然,从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开销
对于实现此技术的更高级别抽象,请查看中的类(简单示例)