正在学习CUDA,但目前仍处于停滞状态

正在学习CUDA,但目前仍处于停滞状态,cuda,Cuda,所以最近我一直在努力学习CUDA,但现在我陷入了困境,不知道我做错了什么。我试图根据0和1之间的随机浮点设置opool数组的初始值。如果有人能说明我做错了什么,我将不胜感激 注意-为了简洁起见,我省略了一些代码(主要是cudaFree()和free()调用)。如果我遗漏了任何重要的代码,我深表歉意 __global__ void FirstLoop( int *opool, float *randomSet, int omax, int anumber ) { int tid_loci = th

所以最近我一直在努力学习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);
}
\uuuu全局\uuuu无效第一循环(int*opool、float*randomSet、int omax、int anumber)
{
int tid_loces=threadIdx.x;
int tid_2=线程idx.y;
int bid_omax=blockIdx.x;
int index=omax*tid_基因座*2+omax*tid_2+bid_omax;
float r=随机集[索引];
//注释掉的代码是应该设置的,但它们被设置为5或15
//以确定是否正确设置了值。
如果(r<0.99)
opool[index]=15;/(int)((r*100.0)*-1.0);
其他的
opool[index]=5;/(int)((r)*(float)(anumber-4))+5;
}
int main()
{
int位点=10;
int omax=20;
//存储在主机上的数据
int*h_opool;
float*h_随机集;
//存储在设备上的数据
int*d_opool;
浮点*d_随机集;
int poolSize=helpSize*omax;
int randomSize=位点*2*omax*sizeof(浮点);
//将数组调整为所需大小
h_opool=(int*)malloc(poolSize);
h_randomSet=(float*)malloc(randomSize);
Cudamaloc(和d_opool,池大小);
Cudamaloc(d_randomSet,randomSize);
对于(sim=0;sim更改以下内容

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


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

您的错误是什么?编译器?链接器?意外行为?请提供详细信息。您可以尝试执行一些非常简单且非随机的操作,以帮助进行故障排除。所有操作都可以正确编译,但会出现意外行为。一些内核FirstLoop函数中发生了意外情况。opool的每个元素都应该设置为5或15。当将opool中的每个元素打印到屏幕上时,它们都偏离了(类似于10932812)。您是否检查cuda调用和内核执行的返回码?
int index = bid_omax * tid_2 + tid_loci;