2 u011739093 u011739093 于 2014.04.20 11:54 提问

cuda向设备端传递多个一维数组,并在核函数修改数组元素值

现在有多个一维数组,我想将他们拷贝到设备端修改他们的值,然后拷贝回host端,代码如下:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "helper_cuda.h"
#include
#include
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,可能自己理解有误,望各位大神指点

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
cuda向设备端传递多个一维数组,并在kernel中引用方法
向device端传递N个一维数组: 1,应该在主机端开辟N个一维数组,然后在device端开辟N个一维数组,并将数据从主机端复制设备端 2.分别在主机端和设备端开辟N个指针数组,主机端指针数组各个指针分别保存设备端各个数组的头指针; 3将主机端指针数组拷贝到设备端指针数组; 这样设备端指针数组各个指针就指向设备端各个数组的头指针了 代码示例 //功能:创建多个一维数组,在dev
给cuda核函数传递二维数组的一种方法
#include /** * 需求:需要把若干个一维数组传给核函数 * 实现方法:在gpu生成一个一维的指针数组,每个元素指向一个普通一维数组。 * 把该指针数组的地址传递给核函数。 * 其实该指针数组充当二维数组的角色。 */ __global__ void testKernel(float ** pointerArray) { printf("(%d,%d):%f\n",th
CUDA 常数与指针的传递
#include #include "cuda_runtime.h" #include "device_launch_parameters.h" #include #include #include using namespace std; __global__ void func3(int * const data, int num_elements); #define
CUDA GPU编程中使用结构体传递函数参数
CUDA GPU编程中使用结构体传递函数参数            CUDA GPU编程中,虽然统一寻址(Unified Memory)技术能够大大简化编程难度和代码复杂度,但是速度略有牺牲,同时对运行环境提出更多的要求。而在不使用这项技术时,编程时需要同时创建CPU(host)和GPU(device)端的变量指针,然后为其分别分配内存。操作完成后,再分别释放内存。CUDA工程的范例程序中,单
cuda结构体数组拷贝
逐一拷贝结构体元素 code: struct cudaWeakr { int* loc; float* detaSb; }; int main() { float arrayA[2][3] = { {1, 2 ,3},{11,22,33}}; int arrayB[3]={1, 2 ,3}; const int K=3; cudaWeakr*c
CUDA流-数据复制与核函数执行并行
http://blog.csdn.net/u010335328/article/details/52453499 1. CUDA流介绍 CUDA流在加速应用程序方面起着重要的作用。CUDA流表示一个GPU操作队列,并且该队列中的操作将以指定的顺序执行。我们可以在流中添加一些操作,如核函数启动,内存复制等。将这些操作添加到流的顺序也就是他们的执行顺序。你可以将每个流视为GPU上的一个任务,并且这
CUDA中如何在设备上分配全局变量
[cpp] view plaincopy 假设定义了全局变量 __device__ int *a;   我需要一个数组,动态分配,那么直接调用cudaMalloc来为a分配内存的话,是不行的。 具体做法如下 [cpp] view plaincopy int *tmp;  
cuda kernel 核函数内分配存储空间
key point: kernel内部使用new[], delete[]分配存储空间 #include #include #include #include #include #include #include using namespace std; __global__ void dev_alloc() {    int num = 10;
CUDA/ GPU: CUDA核函数的运行参数
转载自:http://blog.csdn.net/jonny_super/article/details/23208227 核函数是GPU每个thread上运行的程序。必须通过__gloabl__函数类型限定符定义。形式如下:                 __global__ void kernel(param list){  } 核函数只能在主机端调用,调用时必须申明执
GPU(CUDA)学习日记(十)------ Kernal 内核函数 参数的传递
之前做了一个项目,内核函数什么的编写都没有问题,但是处理完的图片就是会产生条纹,这个问题困扰了我很长时间(真的很长时间。。。),我的内核函数传入的参数有很多,我做过实验,在host函数中给所有的参数都cudamalloc显卡空间(当初以为这样处理会更省显存一些,毕竟是开辟的线性存储器globle memory空间),但是实验结果是每一个参数都开辟cudamalloc的话,速度会降低,显卡的显存也没