轻云流风 发表于 2014-4-20 11:49:57

cuda向设备端传递多个一维数组,修改值后拷贝回host端

现在有多个一维数组,我想将他们拷贝到设备端修改他们的值,然后拷贝回host端,代码如下:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "helper_cuda.h"
#include <stdio.h>
#include<iostream>
using namespace std;
#defineN 10
__global__ void gpuKernel(int **ptr)
{       
        int tid=threadIdx.x;
        int bid=blockIdx.x;
        if (tid<N &&bid<N)
        {               
                ptr=N;               
        }
}
int main()
{
        int **hptr,**hostArray;
        int **dptr,**devArray;
        hptr=new int *;
        cudaMalloc(&dptr,N*sizeof(int*));       
        hostArray=new int *;
        devArray=new int *;
        for (int i=0;i<N;i++)
        {
                hostArray=new int;
                for (int j=0;j<N;j++)
                {
                        hostArray=1;
                }
        }
        for (int i=0;i<N;i++)
        {
                cudaMemcpy(devArray,hostArray,N*sizeof(int),cudaMemcpyHostToDevice);
                hptr=devArray;//保存每个数组的头指针
        }
       
        cudaMemcpy(dptr,hptr,N*sizeof(int*),cudaMemcpyHostToDevice);       
        dim3 dimblock=N;
        dim3 dimgrid =N;
        gpuKernel<<<dimgrid,dimblock>>>(dptr);
        for (int i=0;i<N;i++)
        {                cudaMemcpy(hostArray,devArray,N*sizeof(int),cudaMemcpyDeviceToHost);               
        }
        for (int i=0;i<N;i++)
        {
                for (int j=0;j<N;j++)
                {
                        cout<<hostArray<<",";
                }
                cout<<endl;
               
        }
        //free memory
        for (int i=0;i<N;i++)
        {
                delete []hostArray;
                cudaFree(devArray);
        }
        cudaFree(dptr);
        /*cudaFree(devArray);*/
        delete[]hptr;
        delete []hostArray;
        delete[]devArray;   

    return 0;
}
最终结果是元素值都为修改,纠结这个问题几天了,并且仔细拜读bendanban大神的博客http://blog.csdn.net/bendanban/article/details/7669624,可能自己理解有误,望各位鱼油指点

轻云流风 发表于 2014-4-20 11:52:42

纠正一下,是所有的值都没有被修改,写错了,请各位鱼友看看,帮我修改修改代码

仰望天上的光 发表于 2014-4-20 12:58:41

__global__ void gpuKernel(int **ptr)
二维数组没有你这样传递参数的,事实上一维数组也没有你这样传递参数的。你忘记了吗?C语言里的一维数组作为函数的参数传递要传递两个参数:一个是数组名,一个是数组长度
同理,C语言里的二维数组作为函数的参数传递要传递三个参数:一个是数组名,一个是数组第一维长度,一个是数组第二维长度

轻云流风 发表于 2014-4-20 15:27:42

仰望天上的光 发表于 2014-4-20 12:58 static/image/common/back.gif
__global__ void gpuKernel(int **ptr)
二维数组没有你这样传递参数的,事实上一维数组也没有你这样传递参 ...

问题应该不是在这里,我试了,数组长度信息,我在宏定义里面有的

轻云流风 发表于 2014-4-20 16:05:14

for (int i=0;i<N;i++)
      {
                  cudaFreeMalloc(&devArray,N*sizeof(int));
                cudaMemcpy(devArray,hostArray,N*sizeof(int),cudaMemcpyHostToDevice);
                hptr=devArray;//保存每个数组的头指针
      }
这个地方再加一句话

仰望天上的光 发表于 2014-4-20 17:09:23

轻云流风 发表于 2014-4-20 15:27 static/image/common/back.gif
问题应该不是在这里,我试了,数组长度信息,我在宏定义里面有的

把你程序中所有的int**类型都换成
int (*)就可以了
页: [1]
查看完整版本: cuda向设备端传递多个一维数组,修改值后拷贝回host端