我正在研究 OpenCL,与我期望它的运行方式相比,我有点困惑为什么这个内核运行得这么慢。这是内核:
__kernel void copy(
const __global char* pSrc,
__global __write_only char* pDst,
int length)
{
const int tid = get_global_id(0);
if(tid < length) {
pDst[tid] = pSrc[tid];
}
}
我通过以下方式创建了缓冲区:
char* out = new char[2048*2048];
cl::Buffer(
context,
CL_MEM_USE_HOST_PTR | CL_MEM_WRITE_ONLY,
length,
out);
输入缓冲区同上,除了我已将 in 指针初始化为随机值。最后,我以这种方式运行内核:
cl::Event event;
queue.enqueueNDRangeKernel(
kernel,
cl::NullRange,
cl::NDRange(length),
cl::NDRange(1),
NULL,
&event);
event.wait();
平均而言,时间约为 75 毫秒,计算公式如下:
cl_ulong startTime = event.getProfilingInfo<CL_PROFILING_COMMAND_START>();
cl_ulong endTime = event.getProfilingInfo<CL_PROFILING_COMMAND_END>();
std::cout << (endTime - startTime) * SECONDS_PER_NANO / SECONDS_PER_MILLI << "\n";
我正在运行带有 Intel i5-3450 芯片(Sandy Bridge 架构)的 Windows 7。相比之下,进行复制的“直接”方式只需不到 5 毫秒。我不认为 event.getProfilingInfo 包括主机和设备之间的通信时间。想法?
编辑:
在 ananthonline 的建议下,我将内核更改为使用 float4s 而不是 chars,这将平均运行时间降低到大约 50 毫秒。仍然没有我希望的那么快,但有所改善。谢谢ananthonline!