SYCL/DPC++使用USM时std::array转void*编译报错如何解决?
问题修复说明
- 编译错误原因:SYCL的
handler::memcpy接口要求源、目标参数都为内存裸指针,std::array是容器对象,无法隐式转换为void*类型,需要调用std::array的data()成员方法获取其底层存储的首地址,替换两次memcpy调用中的h_a为h_a.data()即可解决编译报错。 - 运行时潜在错误:你代码中使用
malloc_device分配的d_a是设备专属内存,仅能在设备内核中访问,主机侧直接读取d_a[i]会触发段错误,打印逻辑中需要删除对d_a的直接访问。
修复后完整代码如下:
#include <CL/sycl.hpp> #include <array> #include <iostream> using namespace std; using namespace sycl; const int n = 6; int main() { queue q; std::array<int,n> h_a; int *d_a = malloc_device<int>(n, q); for (int i = 0; i < n; i++) h_a[i] = n; q.submit([&](handler& h) { // 修复:传入array的底层指针 h.memcpy(d_a, h_a.data(), n * sizeof(int)); }); q.wait(); q.submit([&](handler& h) { h.parallel_for(n, [=](id<1> i) { d_a[i] = d_a[i] * 2; d_a[i] = d_a[i] + 2; d_a[i] = d_a[i] - 2; d_a[i] = d_a[i] + 2; }); }); q.wait(); q.submit([&](handler& h) { // 修复:传入array的底层指针 h.memcpy(h_a.data(), d_a, n * sizeof(int)); }); q.wait(); for(int i = 0;i < n;i++){ // 修复:删除主机侧访问设备指针的逻辑 cout<<h_a[i]<<" "; } cout<<"\n"; free(d_a, q); return 0; }
修复后代码预期输出6个14,运算逻辑验证:初始值6,乘2得12,加2得14,减2得12,加2得14,结果符合预期。
内容的提问来源于stack exchange,提问作者sv6
相关产品推荐
相关产品推荐

