用户
 找回密码
 立即注册
wyckk1987101 该用户已被删除
发表于 2013-11-8 22:01:31
75396
版主,您好!我接触CUDA不久,有几个问题想请教版主。
我想一个二维数组complex A[32][4096],对它进行相应的运算。设置下面Grid与Block的维度:
  1. dim3 dimBlock(256,1);
  2.         dim3 dimGrid((4096+dimBlock.x-1)/dimBlock.x,(32+dimBlock.y-1)/dimBlock.y);
复制代码
其中:将二维数组A拷贝到全局存储器complex *a,对a分为32行4096列处理,下面是我设置的线程块索引,不知道对吗?
  1. const int tid = blockIdx.x * blockDim.x + threadIdx.x;
  2.                             const int bid = blockIdx.y
  3.                             .....=a[bid*4096+tid]
复制代码
版主,我想知道我这么设置索引还有对a进行这样处理对吗?
谢谢。
使用道具 举报 回复
发表于 2013-11-9 00:32:23
您这样做是对的。

但是您需要注意2点:
(1)如果你将来的complex A不在是4096列32行这样能被您的dimBlock(256,1)正好整除的大小,则您需要在kernel中使用if筛选出多余的越界的线程,避免kernel挂掉。
(2)您可能有个笔误,如果需要将complex A[][]复制到complex *a, 则您需要写成a[bid * 4096 + tid] = ...; 而不是反过来(您笔误了?)

感谢深夜来访。
使用道具 举报 回复 支持 反对
发表于 2013-11-10 20:07:11
玫瑰幻想 发表于 2013-11-9 00:32
您这样做是对的。

但是您需要注意2点:

谢谢玫瑰版主!我现在还有一个疑问,就是让两个这种数组进行行—行相乘,我使用上面的方法,以下是我的代码,结果无法正确显示:
  1. Complex * temporary_signal;
  2. cudaMalloc((void **)&temporary_signal, 256*4096*sizeof(Complex));
  3. memset(temporary_signal,0,256*4096*sizeof(Complex));

  4. Complex * temporary_filter;
  5. cudaMalloc((void **)&temporary_filter, 256*4096*sizeof(Complex));
  6. memset(temporary_filter,0,256*4096*sizeof(Complex));

  7. dim3 dimBlock(256,1);
  8. dim3 dimGrid((4096+dimBlock.x-1)/dimBlock.x,(32+dimBlock.y-1)/dimBlock.y);
  9. ComplexPointwiseMulAndScale<<<dimGrid,dimBlock>>>(d_signal,d_filter,temporary_signal,temporary_filter,4096,1.0f/4096);
  10.                      
  11. //频域相乘的内核函数
  12. static __global__ void ComplexPointwiseMulAndScale(Complex* a,Complex* b,Complex* c,Complex* d, int size, float scale)
  13. {
  14.        const int tid = blockIdx.x * blockDim.x + threadIdx.x;
  15.        const int bid = blockIdx.y
  16.        const int numThreads=blockDim.x*gridDim.x;

  17.        c[tid]=a[bid*4096+tid];
  18.        d[tid]=b[bid*4096+tid];
  19.                
  20.        for (int g = tid; g < 4096; g +=numThreads)  
  21.        {
  22.         c[g] = ComplexScale(ComplexMul(c[g], d[g]), scale);

  23.        }
复制代码
玫瑰版主,是不是问题出在最后的结果赋值上面了?还是其他地方?
使用道具 举报 回复 支持 反对
发表于 2013-11-10 21:48:06
01.Complex * temporary_signal;

02.cudaMalloc((void **)&temporary_signal, 256*4096*sizeof(Complex));

03.memset(temporary_signal,0,256*4096*sizeof(Complex));

04.

问一下楼主这是什么字体呀?几号字?
使用道具 举报 回复 支持 反对
发表于 2013-11-10 23:24:01
wyckk1987101 发表于 2013-11-10 20:07
谢谢玫瑰版主!我现在还有一个疑问,就是让两个这种数组进行行—行相乘,我使用上面的方法,以下是我的代 ...

LZ您好:

大体目测您的kernel,似乎没什么明显的问题,(如果有越界的话,您快速nsight跑一下就能发现),以及如果您不需要输出c,d两个数组另作他用的话,完全可以直接使用读入的a,b数组的值进行计算并保留到global memory,而不用这样再倒一遍。

大致如此,祝您编码顺利~
使用道具 举报 回复 支持 反对
发表于 2013-11-11 14:41:03
acone 发表于 2013-11-10 21:48
问一下楼主这是什么字体呀?几号字?

直接在回复中插入代码的结果就是这样,无任何设置。
使用道具 举报 回复 支持 反对
发表于 2013-11-11 14:42:48
ice 发表于 2013-11-10 23:24
LZ您好:

大体目测您的kernel,似乎没什么明显的问题,(如果有越界的话,您快速nsight跑一下就能发现) ...

ice版主,谢谢您。我使用您提示的方法尝试一下,由于各种原因,无法使用nsight,只能单步调试。
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册