【发布时间】:2018-02-15 16:39:30
【问题描述】:
我在 Intel Core i7-7600U 的 iGPU 上遇到了异步数据传输问题。
一个小例子的核心代码:
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
auto platform = platforms.front();
std::vector<cl::Device> devices;
platform.getDevices(CL_DEVICE_TYPE_GPU, &devices);
auto device = devices.front();
cl::Context context(device);
char buf[16];
cl::Buffer memBuf(context, CL_MEM_READ_WRITE, sizeof(buf));
cl::CommandQueue queue(context, device);
cl::Event ev;
queue.enqueueWriteBuffer(memBuf, CL_FALSE, 0, sizeof(buf), buf, NULL, &ev);
int status;
do{
ev.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS, &status);
}while(status != 0);
std::cout << "DONE" << std::endl;
它应该做的是忙于等待数据传输。这可以包含在调度程序中(并且在 starPU 中)
但是它没有通过循环。当我改用 CPU (CL_DEVICE_TYPE_CPU) 时,它可以工作。当我使用ev.wait() 或queue.finish() 时,它可以工作。
这是英特尔的错误吗? OpenCL 标准中是否有任何内容允许实现延迟调度直到实际等待?
供参考:使用Linux Mint,内核4.13.0-32-generic #35~16.04.1-Ubuntu SMP。
来自https://software.intel.com/en-us/articles/opencl-drivers 的 OpenCL 运行时(intel-opencl-r5.0 (SRB5.0) Linux 驱动程序包)并通过以下方式安装:
sudo alien --to-deb *.rpm
sudo dpkg -i *.deb
sudo ln -s /opt/intel/opencl/include/CL /usr/local/include/CL
sudo apt-get install ocl-icd-libopencl1
【问题讨论】:
标签: asynchronous opencl intel gpgpu