Сумма умножения для двумерного массива в CUDA - PullRequest
0 голосов
/ 09 декабря 2011

Я новичок в 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 к столбцам

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Я думаю, что ваше ядро ​​может выглядеть следующим образом

__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 голосов
/ 09 декабря 2011

Имена переменных указывают, что первая строка - это умножение с использованием вектора v1, а вторая - с v2. Но вместо этого вы делаете это перекрестно. Может быть, вы хотите иметь

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

с обменом индексов 1 и 2?

...