Изучаю CUDA, но в данный момент застрял - PullRequest
0 голосов
/ 14 декабря 2011

Итак, я пытался изучать CUDA в последнее время, но в данный момент я застрял и не знаю, что я делаю неправильно. Я пытаюсь установить начальное значение массива opool на основе случайного числа с плавающей запятой в диапазоне от 0 до 1. Если кто-нибудь сможет пролить свет на то, что я сделал неправильно, это будет с благодарностью.

Примечание. Для краткости я пропустил некоторый код (в основном это вызовы 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 Ответ

2 голосов
/ 14 декабря 2011

Измените следующие значения

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.

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