向量和的 CUDA 统一内存实现

CUDA unified memory implementation for vector sum

我尝试使用统一内存架构实现向量加法。这是我的代码

#include<stdio.h>
#include<cuda.h>

#define n 10
__global__ void vec_add(float *c, float *a, float *b, int n){

        int i;
        //Get global thread ID
        i = blockDim.x*blockIdx.x+threadIdx.x;
        if(i<n){
                c[i] = a[i] + b[i];
        }
}

int main(int argc, char* argv[]){

        int thread_count;
        float *a, *b, *c;
        
        thread_count = strtol(argv[1], NULL, 10);
        cudaMallocManaged(&c, n*sizeof(float));
        cudaMallocManaged(&a, n*sizeof(float));
        cudaMallocManaged(&b, n*sizeof(float));

for(int i=0; i<n; i++){
                a[i]=1.0;
                b[i]=2.0;
}


//Launch Kernel
        vec_add<<<1,thread_count>>>(c, a, b, n);

        //Synchronize threads
        cudaDeviceSynchronize();

for(int i=0; i<n; i++){
                printf("%f + %f =%f\n", a[i], b[i], c[i]);
}
                        cudaFree(c);
                        cudaFree(a);
                        cudaFree(b);


        return 0;
}

我在 运行 代码 expected a ")" 时出错。我没有发现括号问题。我怎样才能从错误中恢复?另外我需要一个关于如何使用统一内存编写cuda程序的简要结构描述。

here是简要说明。

您遇到的问题在这里:

#define n 10
__global__ void vec_add(float *c, float *a, float *b, int n){

您可能不知道 C++ 预处理器宏 (#define) 是如何工作的。它创建一个将由预处理器执行的替换。所以你告诉预处理器要做的是像这样改变你的内核定义行

__global__ void vec_add(float *c, float *a, float *b, int 10){
                                                        ^^^^^

当然,对于函数定义而言,这不是有效的 C++ 语法。解决此问题的一种可能方法是将(内核)函数定义中的变量名称更改为 n 以外的名称,可能像这样:

#define n 10
__global__ void vec_add(float *c, float *a, float *b, int nk){

        int i;
        //Get global thread ID
        i = blockDim.x*blockIdx.x+threadIdx.x;
        if(i<nk){
                c[i] = a[i] + b[i];
        }
}

即使这恰好是一个 CUDA 内核定义,如果您编写一个普通函数定义并使用 n 作为函数参数之一,这里的问题将完全相同。这与对 C++ 的理解有关,与 CUDA 无关。