鱼C论坛

 找回密码
 立即注册
查看: 3364|回复: 5

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

[复制链接]
发表于 2014-4-20 11:49:57 | 显示全部楼层 |阅读模式
200鱼币
现在有多个一维数组,我想将他们拷贝到设备端修改他们的值,然后拷贝回host端,代码如下:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "helper_cuda.h"
#include <stdio.h>
#include<iostream>
using namespace std;
#define  N 10
__global__ void gpuKernel(int **ptr)
{       
        int tid=threadIdx.x;
        int bid=blockIdx.x;
        if (tid<N &&bid<N)
        {               
                ptr[bid][tid]=N;               
        }
}
int main()
{
        int **hptr,**hostArray;
        int **dptr,**devArray;
        hptr=new int *[N];
        cudaMalloc(&dptr,N*sizeof(int*));       
        hostArray=new int *[N];
        devArray=new int *[N];
        for (int i=0;i<N;i++)
        {
                hostArray[i]=new int[N];
                for (int j=0;j<N;j++)
                {
                        hostArray[i][j]=1;
                }
        }
        for (int i=0;i<N;i++)
        {
                cudaMemcpy(devArray[i],hostArray[i],N*sizeof(int),cudaMemcpyHostToDevice);
                hptr[i]=devArray[i];//保存每个数组的头指针
        }
       
        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[i],devArray[i],N*sizeof(int),cudaMemcpyDeviceToHost);               
        }
        for (int i=0;i<N;i++)
        {
                for (int j=0;j<N;j++)
                {
                        cout<<hostArray[i][j]<<",";
                }
                cout<<endl;
               
        }
        //free memory
        for (int i=0;i<N;i++)
        {
                delete []hostArray[i];
                cudaFree(devArray[i]);
        }
        cudaFree(dptr);
        /*cudaFree(devArray);*/
        delete[]hptr;
        delete []hostArray;
        delete[]devArray;   

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-20 11:52:42 | 显示全部楼层
纠正一下,是所有的值都没有被修改,写错了,请各位鱼友看看,帮我修改修改代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-20 12:58:41 | 显示全部楼层
__global__ void gpuKernel(int **ptr)
二维数组没有你这样传递参数的,事实上一维数组也没有你这样传递参数的。你忘记了吗?C语言里的一维数组作为函数的参数传递要传递两个参数:一个是数组名,一个是数组长度
同理,C语言里的二维数组作为函数的参数传递要传递三个参数:一个是数组名,一个是数组第一维长度,一个是数组第二维长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-20 15:27:42 | 显示全部楼层

问题应该不是在这里,我试了,数组长度信息,我在宏定义里面有的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-20 16:05:14 | 显示全部楼层
for (int i=0;i<N;i++)
        {
                  cudaFreeMalloc(&devArray[i],N*sizeof(int));
                cudaMemcpy(devArray[i],hostArray[i],N*sizeof(int),cudaMemcpyHostToDevice);
                hptr[i]=devArray[i];//保存每个数组的头指针
        }
这个地方再加一句话
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-20 17:09:23 | 显示全部楼层
轻云流风 发表于 2014-4-20 15:27
问题应该不是在这里,我试了,数组长度信息,我在宏定义里面有的

把你程序中所有的int**类型都换成
int (*)[N]就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 02:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表