指针数组作为cuda kernel函数的参数

lumanman_ 学生  2016-01-19 05:43:44
我有一个程序,功能就是有一个3页的数据,高为Height,宽为Width,然后我一个block中的线程数为Height*Width,一维的,(这只是测试,用的Height和Width比较小,所以就这样分配吧),grid也是一维,大小是3,kernel函数的功能就是每个线程输出自己的blockIdx.x,threadIdx.x和所要处理的数据data。因为我在别的程序中必须要用到指针数组做函数新参数,所以这个程序只是对指针数组做函数参数做一个测试,没有什么实际的作用。可是一直不对,核函数不会有任何输出,所有线程好像都没有执行,实在不知道咋弄了,求各位帮帮忙!

#include<stdio.h>
#include<cuda_runtime.h>
#define Height 3
#define Width 5

__global__ void printf_kernel(int **dev_ptr)
{
if(blockIdx.x < 3)
{
//printf("(%d,%d)\n",blockIdx.x,threadIdx.x);

int pos=threadIdx.x;

int *pptr=*(dev_ptr+blockIdx.x);

int data=pptr[pos];

printf("(%d,%d): %d\n",blockIdx.x,threadIdx.x,data);

}
}


int main()
{
int a[3*Height*Width];
int i,j,k;
for(k=0;k<3;k++)
{
for(i=0;i<Height;i++)
{
for(j=0;j<Width;j++)
{
a[k*Width*Height+i*Width+j]=k+i+j;
printf("%d ",a[k*Height*Width+i*Width+j]);
}
printf("\n");
}
printf("\n");
printf("\n");
}

int *dev_ptr[3];
for(i=0;i<3;i++)
{
cudaMalloc((void**)&dev_ptr[i],sizeof(int)*Width*Height);

cudaMemcpy(dev_ptr[i],a+i*Width*Height,sizeof(int)*Width*Height,cudaMemcpyHostToDevice);
}


dim3 block(Height*Width);
dim3 grid(3);

printf_kernel<<<grid,block>>>(dev_ptr);

cudaDeviceSynchronize();

return 0;
}
...全文
270 点赞 收藏 5
写回复
5 条回复
lumanman_ 2016年01月21日
多谢指点,已改正! int *d_a=NULL; int *d_b=NULL; cudaMalloc((void**)&d_a,sizeof(int)*32); cudaMalloc((void**)&d_b,sizeof(int)*32); cudaMemcpy(d_a,a,sizeof(int)*32,cudaMemcpyHostToDevice); cudaMemcpy(d_b,b,sizeof(int)*32,cudaMemcpyHostToDevice); int *h_batch[]={d_a,d_b}; int **d_batch=NULL; cudaMalloc((void***)&d_batch,sizeof(h_batch)); cudaMemcpy(d_batch,h_batch,sizeof(h_batch),cudaMemcpyHostToDevice); dim3 gridSize(1,1); dim3 blockSize(32,1); func<<<gridSize,blockSize>>>(d_batch); cudaMemcpy(h_batch,d_batch,sizeof(d_batch),cudaMemcpyDeviceToHost); cudaMemcpy(a,d_a,sizeof(int)*32,cudaMemcpyDeviceToHost); cudaMemcpy(b,d_b,sizeof(int)*32,cudaMemcpyDeviceToHost); cudaFree(d_a); cudaFree(d_b); cudaFree(d_batch);
回复 点赞
瑞卡哥哥 2016年01月20日
int **Ptr 二级指针 需要两次分配内存才可以使用 int *ptr[5] 指针数组 变量声明时就为变量分配了 5个指针的空间 但是每个指针都是野指针. int (*ptr) [5] 数组指针 即开始只声明了一个指针 指向未知数量的 int[5] 类型数组 即 int[x][5] x 未知,
回复 点赞
瑞卡哥哥 2016年01月20日
而你在 printf_kernel 函数中解析 是按照连续内存的方式 即 二维数组的方式 做的.
回复 点赞
瑞卡哥哥 2016年01月20日
你应该先了解 指针数组,数组指针,二级指针的区别 int *dev_ptr[3]; 在初始化的时候 只是在内存分配 了3个指针的空间 32位为例 即 dev_ptr 变量只有12个字节,三个指针. 三个指针的指向并不是连续的内存空间
回复 点赞
pww71 2016年01月20日
太落伍了 用这个看看 http://blog.csdn.net/pww71/article/details/25113303
回复 点赞
发动态
发帖子
高性能计算
创建于2008-07-01

1867

社区成员

1018

社区内容

高性能计算
社区公告
暂无公告