Я пытаюсь скопировать входной массив 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 .... (я проверю, и число даже не в исходном массиве).Итак, кто-нибудь, кто-нибудь может увидеть, что я сделал не так?