尝试些了自己第一个CUDA程序,结果问题果然很多,先把问题程序框架贴上来。(这个程序是有错误的!)
#include <stdio.h>
#include <stdlib.h>
#include <cutil.h>
#include <cutil_inline.h>
struct PStruct
{
int PSize;
float *PMatrix;
};
__global__ void KernelStruct(PStruct *pstruct)
{
int PSize=pstruct->PSize;
int Idx=threadIdx.x;
if (Idx<PSize)
{
pstruct->PMatrix[Idx]=pstruct->PMatrix[Idx]+1;
}
}
int main()
{
int i;
PStruct CPU_Struct,GPU_Struct;
//初始化CPU
int PSize=10;
CPU_Struct.PSize=PSize;
CPU_Struct.PMatrix=(float*)malloc(PSize*sizeof(float));
for (i=0;i<PSize;i++)
{
CPU_Struct.PMatrix[i]=i;
}
//初始化GPU
GPU_Struct.PSize=PSize;
cutilSafeCall(cudaMalloc((void**)&GPU_Struct.PMatrix,sizeof(float)*PSize));
cutilSafeCall(cudaMemcpy(GPU_Struct.PMatrix,CPU_Struct.PMatrix,sizeof(float)*PSize,cudaMemcpyHostToDevice));
//核函数
dim3 grim(PSize,1,1);
KernelStruct <<<1,grim>>>(&GPU_Struct);
//拷贝到CPU
cudaMemcpy(CPU_Struct.PMatrix,GPU_Struct.PMatrix,sizeof(float)*PSize,cudaMemcpyDeviceToHost);
//打印
FILE *pFile=fopen("Example.txt","w");
for (i=0;i<PSize;i++)
{
fprintf(pFile,"PMatrix[%d]%f\n",i,CPU_Struct.PMatrix[i]);
}
//释放
cudaFree(GPU_Struct.PMatrix);
free(CPU_Struct.PMatrix);
return 0;
}
过程有点悲剧,就直接总结一下问题:
1:数据分配到底是在CPU还是GPU上的问题。其实这个问题很简单,但是自己一直搞混淆了。用malloc分配的就在host上,用cudamalloc分配的就在device上。在CPU上只 能用host上的函数与数据,在GPU上只能用device上的函数与数据。但是CPU和GPU上的通信可以用cudamemcpy等函数通过设置后面的参数得到,也可以通过CPU上的指 针访问GPU上的数据。
2:最重要的是自己一直认为PStruct和PMatrix是一个东西,这个是所有悲剧产生的根源,被各种鄙视无语。在上面的例子中,GPU_Struct是PStruct的一个实例,所以其肯定是 在CPU上的,但是注意这时候其只是包含了一个int类型的数据和一个float类型的地址,这点非常重要,只是float类型的地址在CPU上。后面用cudamalloc给GPU_Struct的 PMatrix分配内存时,得到的空间是在GPU上,但是其地址是在CPU上。
3:最后一点,自己多想问题多总结吧,自己离一个独立的个体还差很远。