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,可能自己理解有误,望各位鱼油指点
纠正一下,是所有的值都没有被修改,写错了,请各位鱼友看看,帮我修改修改代码 __global__ void gpuKernel(int **ptr)
二维数组没有你这样传递参数的,事实上一维数组也没有你这样传递参数的。你忘记了吗?C语言里的一维数组作为函数的参数传递要传递两个参数:一个是数组名,一个是数组长度
同理,C语言里的二维数组作为函数的参数传递要传递三个参数:一个是数组名,一个是数组第一维长度,一个是数组第二维长度 仰望天上的光 发表于 2014-4-20 12:58 static/image/common/back.gif
__global__ void gpuKernel(int **ptr)
二维数组没有你这样传递参数的,事实上一维数组也没有你这样传递参 ...
问题应该不是在这里,我试了,数组长度信息,我在宏定义里面有的 for (int i=0;i<N;i++)
{
cudaFreeMalloc(&devArray,N*sizeof(int));
cudaMemcpy(devArray,hostArray,N*sizeof(int),cudaMemcpyHostToDevice);
hptr=devArray;//保存每个数组的头指针
}
这个地方再加一句话 轻云流风 发表于 2014-4-20 15:27 static/image/common/back.gif
问题应该不是在这里,我试了,数组长度信息,我在宏定义里面有的
把你程序中所有的int**类型都换成
int (*)就可以了
页:
[1]