如何将数据传递给CUDA中的共享变量?

时间:2010-05-03 14:47:43

标签: cuda

我有一个传递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 个答案:

答案 0 :(得分:1)

很好,你是对的,它必须是if(tid&lt; 21)d_ST1 [tid] = ST1 [tid],因为一个块对于这两个大小就足够了。非常感谢你。 但是,你什么时候使用if(idx&lt; n)d_st1 [tid] = st1 [idx]?