SYCL/DPC++代码运行报CL_INVALID_OPERATION错误原因求解
错误原因
- 你提交的第一个和第三个命令组内调用的是C++标准库
memcpy,而非SYCLhandler实例提供的设备内存拷贝接口,这两个命令组没有注册任何SYCL设备操作,属于空命令组,因此触发运行时错误。
SYCL要求所有提交到设备队列的内存操作、内核执行逻辑都必须通过命令组传入的handler实例的对应方法注册,才会被加入到队列任务中。直接调用标准库memcpy属于Host端函数调用,不会被识别为队列任务的操作,且标准库memcpy本身也无法直接读写设备端分配的地址空间,本身就属于错误用法。
修正方案
将两个命令组内的memcpy替换为h.memcpy,调用handler提供的拷贝接口即可,修正后对应代码片段如下:
q.submit([&](handler &h) { h.memcpy(deviceArr, &hostArr[0], 10 * sizeof(int)); }); q.submit([&](handler &h) { h.parallel_for(10, [=](auto &idx) { deviceArr[idx]++; }); }); q.submit([&](handler &h) { h.memcpy(&hostArr[0], deviceArr, 10 * sizeof(int)); });
补充说明
如果需要确保Host端读取结果时队列任务已全部执行完成,可以在最后一次submit后调用q.wait()主动等待队列任务执行完毕,避免出现Host提前读取未更新的hostArr数值的问题。
内容的提问来源于stack exchange,提问作者ArunJose
相关产品推荐
相关产品推荐

