1

0 から 1 の間の乱数を生成する cuda アプリケーションがあります。サイズ 8x256 の行列がカーネルによって生成された乱数で埋められるダミー コードを作成しました。私の元の行列は 8XBIG_NUMBER のようなものになります。しかし、おそらくコードに何かが欠けているため、目的の結果を生成できません。コードを以下に投稿しています。

void main(int argc,char* argv[])    
{
    float *test_var,*dev_test;
    curandState *state;

    test_var = (float *)malloc(8*256*sizeof(float));
    memset(test_var,0,8*256*sizeof(float));

    cudaMalloc((void **)&dev_test,8*256*sizeof(float));
    cudaMemcpy(dev_test,test_var,8*256*sizeof(float),cudaMemcpyHostToDevice);
    dim3 gridDim(1,256/32,1);
    dim3 blockDim(8,32,1);
    cudaMalloc((void **)&state,8*256*sizeof(curandState));
    setup_kernel<<<gridDim,blockDim>>>(state,unsigned(time(NULL)));
    test_kernel<<<gridDim,blockDim>>>(state,dev_test);
    cudaMemcpy(test_var,dev_test,8*256*sizeof(float),cudaMemcpyDeviceToHost);
    system("PAUSE");

    for (int i=0;i<256;i++)
    {   for (int j=0;j<8;j++)
        { printf("%f\t",test_var[i*8+j]);
        }
        printf("\n");
    }

    cudaFree(dev_test);
    cudaFree(state);
    free(test_var);
    exit(0);
}

__global__ void setup_kernel(curandState *state,unsigned long seed)
{
    int id_col  = threadIdx.x + blockDim.x*blockIdx.x;
    int id_row = threadIdx.y+blockDim.y*blockIdx.y;

    curand_init(seed,(id_row*8+id_col),0,&state[id_row*8+id_col]);
}

__global__ void test_kernel(curandState *state,float *dev_test)
{
    int id_col  = threadIdx.x + blockDim.x*blockIdx.x;
    int id_row = threadIdx.y+blockDim.y*blockIdx.y;

     curandState local_state = state[id_row*8+id_col];
     dev_test[id_row*8+id_col] = curand(&local_state);   
     state[id_row*8+id_col] = local_state;
}

マトリックス内の各セルに対して 0 から 1 の間の乱数を生成したいと考えています。誰の助けにも本当に感謝しています。ありがとうございました

4

1 に答える 1