Как передать данные в общую переменную в CUDA? - PullRequest
1 голос
/ 03 мая 2010

У меня есть ядро, которое передает 3 массива, первый массив d_A1 не имеет данных и используется только для записи данных, два других массива d_D1 и d_ST1 имеют данные.

Размер первого массива:

d_A1[13000000]

Размер второго массива:

d_D1[421]

Размер третьего массива:

d_ST1[21]

N - 13000000

TestArray<<<n_blocks, block_size>>>(d_A1,N, d_D1, d_ST1);

Теперь я хочу передать только данные d_D1 [421] и d_ST1 [21] в общие массивы, поэтому я создал общие массивы как:

__global__ void TestArray(int* A1, unsigned int N,  int* D1, unsigned int* ST1)
{

   unsigned int __align__(16) tid = threadIdx.x;
   unsigned int __align__(16) idx = __umul24(blockDim.x, blockIdx.x) + threadIdx.x;  
   __shared__ unsigned int __align__(16) s_D1[441];  //Shared array for d_D1
   __shared__ unsigned int __align__(16) s_ST1[21];  //Shared array for d_ST1

   if (idx < N)   //13000000

   {

Q. Как передать данные d_D1 [441] и d_ST1 [21] в s_D1 [441] и s_ST1 [21]? Я попробовал:

      while (idx < 441)

        s_D1[tid] = d_D1[idx] 

      __syncthreads(); 


      while (idx < 21)

        s_ST1[tid] = d_ST1[idx] 


      __syncthreads();  

но компьютер зависает, и я должен перезагрузить его. Я тоже попробовал один раз, а именно только кулак время, а потом только второе время, без удачи.

Если я использую глобальную память, а именно, d_D1, d_ST1, все работает. Итак, вопрос: Как вы передаете данные в общую переменную / массив, если размер массива не N?

   }   //End of kernel processing



}

1 Ответ

1 голос
/ 04 мая 2010

Отлично, вы правы, так и должно быть, если (tid <21) d_ST1 [tid] = ST1 [tid], поскольку для этих двух размеров достаточно одного блока. Спасибо вам большое. Однако когда вы используете if (idx <n) d_st1 [tid] = st1 [idx]? </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...