学习CUDA,但目前卡住了

时间:2011-12-14 01:50:00

标签: cuda

所以我最近一直在努力学习CUDA,但我目前陷入困境,不知道自己做错了什么。我试图根据0到1之间的随机浮点数来设置opool数组的初始值。如果有人能够解释我做错了什么,那将非常感激。

注意 - 我为了简洁省略了一些代码(cudaFree()& free()主要是)。如果我遗漏了任何重要的代码,我会道歉。

__global__ void FirstLoop( int *opool, float *randomSet, int omax, int anumber )
{
int tid_loci = threadIdx.x;
int tid_2 = threadIdx.y;
int bid_omax = blockIdx.x;

int index = omax*tid_loci*2 + omax*tid_2 + bid_omax;
float r = randomSet[ index ];

// Commented out code is what it should be set to, but they are set to 5 or 15 
    // to determine if the values are correctly being set.
if ( r < 0.99  )
    opool[ index ] = 15; //(int)((r * 100.0) * -1.0);
else
    opool[ index ] = 5;  //(int)((r)*(float)(anumber-4)) +5;
}

int main()
{
  int loci = 10;
  int omax = 20;

      // Data stored on the host
  int *h_opool;
  float *h_randomSet;

  // Data stored on the device
  int *d_opool;
  float *d_randomSet;

  int poolSize   = helpSize * omax;
  int randomSize = loci * 2 * omax * sizeof(float);

  // RESIZE ARRAYS TO NEEDED SIZE
  h_opool    = (int*)malloc( poolSize );      
  h_randomSet= (float*)malloc( randomSize );

  cudaMalloc( &d_opool,    poolSize );
  cudaMalloc( &d_randomSet,randomSize );


  for (sim=0; sim<smax; sim++)
  {
    for (i=0; i<poolSize; i++)
      h_randomSet[i] = rndm();

    dim3 blocks(omax);
    dim3 thread(loci, 2);
    cudaMemcpy( d_randomSet,    h_randomSet,    randomSize,   cudaMemcpyHostToDevice );
    cudaMemcpy( d_opool,   h_opool,    poolSize,    cudaMemcpyHostToDevice );
    FirstLoop<<< blocks, thread >>>(d_opool, d_randomSet, omax, anumber );
    cudaMemcpy( h_opool,   d_opool,    poolSize,    cudaMemcpyDeviceToHost );

    // Here is when I call printf to see the values stored in h_opool, but they are 
    // completely wrong
  }
}
float rndm()
{
  int random = rand();
  return ((float)random / (float)RAND_MAX);
}

1 个答案:

答案 0 :(得分:2)

更改以下内容

int index = omax*tid_loci*2 + omax*tid_2 + bid_omax;

int index = bid_omax * tid_2 + tid_loci;

然而,10x2的块配置可能不是最理想的配置。尝试使用32 x 1或16 x 2。