Как мне скопировать входной массив cuda в общий массив? - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь скопировать входной массив cuda в массив с общей памятью.Первые n значений отлично копируются в общий массив, но после этого происходят довольно странные паттерны.Может кто-нибудь найти, что я делаю неправильно / что здесь происходит?

Я пытался использовать s_x [tid] = x [tid], s_x [row] = x [row] и другие две комбинациитакже.Я знаю, что они не будут иметь логического смысла, но должны попробовать все.

Вот функция ядра, которую я написал:

    __global__ void mv_cuda_shared(float* y, float* A, float* x, int n)
    {
        extern __shared__ float s_x[];
        int row = blockIdx.x * blockDim.x + threadIdx.x;
        int tid = threadIdx.x;
        s_x[row] = x[row];
        __syncthreads();
        if(tid == 0 && row == 0)
                for(int i = 0; i < n; i++){printf("s_x[%d] = %10.6f x = %10.6f\n", i, s_x[i], x[i]);}
        float temp = 0;
        if(row < n)
        {
            for(int k = 0; k < n; k++)
            {
                temp += (A[row*n + k] * s_x[k]);
            }
        }
        y[row] = temp;
    }

и вот где я вызываю ее в основном методе (исключая все биты cuda и копирование):

    mv_cuda_shared<<<(N/BLOCK_SIZE), BLOCK_SIZE, N*sizeof(float)>>>(d_y, d_A, d_x, N);

Так что я ожидаю, что s_x будет соответствовать x.Но вместо этого первые N (n = N) элементов копируются правильно, а остальные, кажется, следуют шаблону.Например, 4 записи после s_x [N-1], скажем, 1. Затем 4 после этого, как .24566 .... (я проверю, и число даже не в исходном массиве).Итак, кто-нибудь, кто-нибудь может увидеть, что я сделал не так?

1 Ответ

1 голос
/ 22 апреля 2019

Ничто в этом коде не имеет особого смысла, но если на самом деле предполагается загружать n элементов массива глобальной памяти в разделяемую память для каждого блока, код копии должен выглядеть примерно так:

    extern __shared__ float s_x[];
    int tid = threadIdx.x;
    for(int i=tid; i<n; i+=blockDim.x) {
       s_x[i] = x[i];
    }
    __syncthreads();

Тем не менее, я сомневаюсь, что это действительно то, что вам нужно, и подозреваю, что вы, возможно, придерживаетесь (неправильного) представления о том, что s_x является общим для всех блоков, а не в области видимости блока, что означает, что у каждого блока будет свойполная копия этого массива в разделяемой памяти.

...