线程块与线程索引的问题

版主,您好!我接触CUDA不久,有几个问题想请教版主。
我想一个二维数组complex A[32][4096],对它进行相应的运算。设置下面Grid与Block的维度:

dim3 dimBlock(256,1);
	dim3 dimGrid((4096+dimBlock.x-1)/dimBlock.x,(32+dimBlock.y-1)/dimBlock.y);

其中:将二维数组A拷贝到全局存储器complex *a,对a分为32行4096列处理,下面是我设置的线程块索引,不知道对吗?

const int tid = blockIdx.x * blockDim.x + threadIdx.x;
   const int bid = blockIdx.y 
   .....=a[bid*4096+tid]

版主,我想知道我这么设置索引还有对a进行这样处理对吗?
谢谢。

您这样做是对的。

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

感谢深夜来访。

谢谢玫瑰版主!我现在还有一个疑问,就是让两个这种数组进行行—行相乘,我使用上面的方法,以下是我的代码,结果无法正确显示:

Complex * temporary_signal;
cudaMalloc((void **)&temporary_signal, 256*4096*sizeof(Complex));
memset(temporary_signal,0,256*4096*sizeof(Complex));

Complex * temporary_filter;
cudaMalloc((void **)&temporary_filter, 256*4096*sizeof(Complex));
memset(temporary_filter,0,256*4096*sizeof(Complex));

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

   c[tid]=a[bid*4096+tid];
   d[tid]=b[bid*4096+tid];
		
   for (int g = tid; g < 4096; g +=numThreads)  
   {
	c[g] = ComplexScale(ComplexMul(c[g], d[g]), scale);

   }

玫瑰版主,是不是问题出在最后的结果赋值上面了?还是其他地方?

[
问一下楼主这是什么字体呀?几号字?

LZ您好:

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

大致如此,祝您编码顺利~

直接在回复中插入代码的结果就是这样,无任何设置。

ice版主,谢谢您。我使用您提示的方法尝试一下,由于各种原因,无法使用nsight,只能单步调试。