一个简单的CUDA程序以及一些总结

尝试些了自己第一个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:最后一点,自己多想问题多总结吧,自己离一个独立的个体还差很远。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值