2011-12-09 31 views
0

二维数组我是新来的CUDA,我想实现乘法加法,这个等式总和乘法在CUDA

enter image description here

enter image description here

我写了这个代码在CUDA,但它并没有给出正确的答案

mulFV1[idx] = f[idx][idy]*compV2[idy]; 
mulFV2[idy] = f[idx][idy]*compV1[idx]; 

,然后,我送阵列mulFV1和mulFV2减少设备功能..

问题是我该如何调试它?

注:要在画面mulFV1是行的关注和关心mulFV2在列

+0

结果被放置在一个变量R [I]?如:R [I] = f [K] [I] * V1 [K]? – Tudor

+0

你解决了那个问题?什么类型的f?你想获得两个数组作为输出吗? – Yappie

+0

@Tudor我希望输出是一个变量,但因为我使用CUDA,我必须将每个线程的结果放在一个数组中,并将它们添加到另一个函数中。 – asma

回答

1

我想,你的内核可能是这个样子以下

__global__ void kernel_code(const int* f,const int* v1,const int* v2, int* outv1, int* outv2) 
{ 
    int idx = blockIdx.x * blockDim.x + threadIdx.x; 
    int idy = blockIdx.y * blockDim.y + threadIdx.y; 
    if (idx<MAX_X && idy <MAX_Y) 
    { 
     if(idx==0) 
     { 
      outv2[idy]=0; 
     } 
     if(idy==0) 
     { 
      outv1[idx]=0; 
     } 
     __syncthreads(); 

     atomicAdd(&(outv1[idx]),f[idy*MAX_Y+ idx]*v2[idy]); 
     atomicAdd(&(outv2[idy]),f[idy*MAX_Y+idx]*v1[idx]); 
    } 
} 
+0

亲爱的Yappie,你能告诉我关于if语句(if(idx == 0)和if(idy == 0)..什么? – asma

+0

谢谢Yappie,veeeery很多,它工作正常,我真的很高兴你...... – asma

+0

这个声明被使用,因为只有一个线程必须提供初始化初始化。对于所有第16个线程,'outv1'只会被初始化为'idx == 0', 'idy'是一样的。 – Yappie

0

你的变量名表示,第一行是使用矢量v1乘法,第二个具有v2。但是,你正在交叉。也许你想有

mulFV1[idx] = f[idx][idy]*compV1[idy]; 
mulFV2[idy] = f[idx][idy]*compV2[idx]; 

与索引1和2交换?

+0

如果你在我的问题中检查数学方程,你会知道第一个eq。关注行,所以我不会改变。对于第二个eq。关于列,所以我不改变.. – asma