DPC++ USM向量加法代码中range函数编译报错如何解决
问题原因
错误根源是C++的「烦人的解析(vexing parse)」规则,你代码中的range<1>(n);这行写法存在二义性:
- 你原本的意图是构造一个
range<1>类型的临时对象 - 但编译器将其解析为:声明一个类型为
range<1>、名字为n的变量,和之前已经定义的int n = 100产生重定义冲突,因此抛出类型不匹配的重定义错误。
额外说明:这行代码就算没有语法错误也属于冗余内容,你没有把构造的range对象赋值给任何变量,后续代码也没有用到它。
修复方案
两种修复方式可选:
方式1(推荐):直接删除冗余行
直接删掉range<1>(n);这一行即可,现有代码中malloc_shared、parallel_for都可以直接接受int类型的长度参数,不需要提前构造range对象。
修正后的完整代码:
#include<CL/sycl.hpp> #include<iostream> #include<chrono> using namespace sycl; int main() { int n=100; int i; queue q{ }; int *a=malloc_shared<int>(n,q); int *b=malloc_shared<int>(n,q); int *c=malloc_shared<int>(n,q); for(i=0;i<n;i++) { a[i]=i; b[i]=n-i; } q.parallel_for(n,[=](auto &i){ c[i]=a[i]+b[i]; }).wait(); for(i=0;i<n;i++){ std::cout<<c[i]<<std::endl; } free(a,q); free(b,q); free(c,q); return 0; }
方式2:正确定义range变量
如果你确实需要显式使用range对象,要给构造的range对象指定变量名,避免语法二义性:
把range<1>(n);改为range<1> work_range(n);,后续需要用到range的地方可以传入这个变量,示例如下:
q.parallel_for(work_range,[=](auto &i){ c[i]=a[i]+b[i]; }).wait();
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

