在 DPC++ 中使用范围函数时出错

Error facing with range function in DPC++

我是 Sycl/DPC++ 语言的新手。我使用统一共享内存 (USM) 编写了示例向量加法代码:

#include<CL/sycl.hpp>
#include<iostream>
#include<chrono>
using namespace sycl;
int main()
{
    int n=100;
    int i;
    queue q{ };
    range<1>(n);
    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;
}

编译时出现以下错误:

warning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'n' [-Wvexing-parse]
range<1>(n);
        ^~~
vec_add.cpp:11:1: note: add enclosing parentheses to perform a function-style cast
range<1>(n);
^
(          )
vec_add.cpp:11:9: note: remove parentheses to silence this warning
range<1>(n);
        ^ ~
vec_add.cpp:11:10: error: redefinition of 'n' with a different type: 'range<1>' vs 'int'
range<1>(n);
         ^
vec_add.cpp:8:5: note: previous definition is here
int n=100;
    ^
1 warning and 1 error generated.

如何解决这个错误?

error: redefinition of 'n' with a different type: 'range<1>' vs 'int'

同一范围内的两个同名变量会给编译器造成混淆,因此这可能是您收到错误的原因。您可以尝试在全局范围内定义 n 的值,例如:#define N 100 在这种情况下,set

range<1>(n);

range<1> (N);

并在您的代码中使用它。

如果您想在本地声明大小,则将另一个变量 (r) 分配给范围

range<1> r (n);

现在您可以直接将 'r' 变量作为参数传递给 parallel_for。