指针数组作为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;
}
...全文
497 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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

2,408

社区成员

发帖
与我相关
我的任务
社区描述
高性能计算
社区管理员
  • 高性能计算社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧