这是我的第一个(剽窃)CUDA计划;
__global__ void vecAdd(float* A, float* B, float* C)
{
int i = threadIdx.x;
A[i]=0;
B[i]=i;
C[i] = A[i] + B[i];
}
#include <stdio.h>
#define SIZE 10
int main()
{
int N=SIZE;
float A[SIZE], B[SIZE], C[SIZE];
float *devPtrA;
float *devPtrB;
float *devPtrC;
int memsize= SIZE * sizeof(float);
cudaMalloc((void**)&devPtrA, memsize);
cudaMalloc((void**)&devPtrB, memsize);
cudaMalloc((void**)&devPtrC, memsize);
cudaMemcpy(devPtrA, A, memsize, cudaMemcpyHostToDevice);
cudaMemcpy(devPtrB, B, memsize, cudaMemcpyHostToDevice);
vecAdd<<<1, N>>>(devPtrA, devPtrB, devPtrC);
cudaMemcpy(C, devPtrC, memsize, cudaMemcpyDeviceToHost);
for (int i=0; i<SIZE; i++)
printf("C[%d]=%f B[%d]=%f\n",i,C[i],i,B[i]);
cudaFree(devPtrA);
cudaFree(devPtrA);
cudaFree(devPtrA);
}
这是输出:
erin @ ubuntu:〜$ nvcc -lcudart vecadd.cu
erin @ ubuntu:〜$。/ a.out
C [0] = 0.000000 B [0] = 0.000000
C [1] = 0.000000 B [1] = 0.000000
C [2] = - 0.344699 B [2] = 0.000000
C [3] = 0.000000 B [3] = 0.000000
C [4] = - 0.344700 B [4] = 0.000000
C [5] = 0.000000 B [5] = 0.000000
C [6] = 0.000000 B [6] = 0.000000
C [7] = 0.000000 B [7] = 0.000000
C [8] = 0.000000 B [8] = - 0.344690
C [9] = 0.000000 B [9] = 0.000000 erin @ ubuntu:〜$
这是在Pathetic Panda(?)12.04上的Ubuntu 64位上。
感谢您的帮助!
此致
埃林
预期输出应打印i
和B[i]
的值C[i]
。
答案 0 :(得分:1)
在我看来,你的CUDA调用简单根本不起作用。 您确定系统中的所有内容都已正确安装吗?请尝试以下方法:
使用以下代码来代替您的代码:
void check() {
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("%s\n",cudaGetErrorString(err));
}
exit(1);
}
在每个CUDA调用之后放置check()
。您可能希望在更大的代码中以某种方式自动执行此操作,但出于测试目的,它应该足够了。如果出现问题,您应该获得人性化的信息。就我而言,我得到了:
CUDA driver version is insufficient for CUDA runtime version
我需要更新它;)
答案 1 :(得分:0)
首先,没有cudaMemcpy调用复制回主机阵列B,您需要添加cudaMemcpy(B, devPtrB, memsize, cudaMemcpyDeviceToHost);
。
然后尝试用
#include "device_launch_parameters.h"
__global__ void vecAdd(float* A, float* B, float* C)
{
int i = threadIdx.x;
A[i]=0;
B[i]=(float)i;
C[i] = (float)(A[i] + B[i]);
}
device_launch_parameters.h标头包含threadIdx.x调用的定义,类型转换为float是可选的,在我的例子中,这个代码在没有它的情况下工作正常。