向量和的 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 无关。
我尝试使用统一内存架构实现向量加法。这是我的代码
#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 无关。