저는 CURAND 라이브러리를 사용하여 0에서 100까지 완전히 독립적 인 난수를 생성하려고합니다. 따라서 각 스레드에 시드를 부여하고 " id = threadIdx.x + blockDim.x * blockIdx.x "를 시퀀스 및 오프셋으로 사용합니다. 그런 다음 난수를 float로 가져온 후 정수를 100으로 곱합니다.CURAND가 균일 한 분포에서 다른 난수를 생성하도록하십시오.
지금 직면하고있는 문제는 스레드가 [0,0]과 [0,1]에 대해 동일한 난수를 얻는 것입니다. 아무리 많은 코드를 11 번 실행해도 문제가 없습니다. 내가 뭘 잘못하고 있는지 이해하고. 도와주세요. 내 아래 코드를 붙여 넣기하고
: 내가 얻을
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include<curand_kernel.h>
#include "util/cuPrintf.cu"
#include<time.h>
#define NE WA*HA //Total number of random numbers
#define WA 2 // Matrix A width
#define HA 2 // Matrix A height
#define SAMPLE 100 //Sample number
#define BLOCK_SIZE 2 //Block size
__global__ void setup_kernel (curandState * state, unsigned long seed)
{
int id = threadIdx.x + blockIdx.x + blockDim.x;
curand_init (seed, id , id, &state[id]);
}
__global__ void generate(curandState* globalState, float* randomMatrix)
{
int ind = threadIdx.x + blockIdx.x * blockDim.x;
if(ind < NE){
curandState localState = globalState[ind];
float stopId = curand_uniform(&localState) * SAMPLE;
cuPrintf("Float random value is : %f",stopId);
int stop = stopId ;
cuPrintf("Random number %d\n",stop);
for(int i = 0; i < SAMPLE; i++){
if(i == stop){
float random = curand_normal(&localState);
cuPrintf("Random Value %f\t",random);
randomMatrix[ind] = random;
break;
}
}
globalState[ind] = localState;
}
}
/////////////////////////////////////////////////////////
// Program main
/////////////////////////////////////////////////////////
int main(int argc, char** argv)
{
// 1. allocate host memory for matrix A
unsigned int size_A = WA * HA;
unsigned int mem_size_A = sizeof(float) * size_A;
float* h_A = (float*) malloc(mem_size_A);
time_t t;
// 2. allocate device memory
float* d_A;
cudaMalloc((void**) &d_A, mem_size_A);
// 3. create random states
curandState* devStates;
cudaMalloc (&devStates, size_A*sizeof(curandState));
// 4. setup seeds
int n_blocks = size_A/BLOCK_SIZE;
time(&t);
printf("\nTime is : %u\n",(unsigned long) t);
setup_kernel <<< n_blocks, BLOCK_SIZE >>> (devStates, (unsigned long) t);
// 4. generate random numbers
cudaPrintfInit();
generate <<< n_blocks, BLOCK_SIZE >>> (devStates,d_A);
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();
// 5. copy result from device to host
cudaMemcpy(h_A, d_A, mem_size_A, cudaMemcpyDeviceToHost);
// 6. print out the results
printf("\n\nMatrix A (Results)\n");
for(int i = 0; i < size_A; i++)
{
printf("%f ", h_A[i]);
if(((i + 1) % WA) == 0)
printf("\n");
}
printf("\n");
// 7. clean up memory
free(h_A);
cudaFree(d_A);
}
출력은 다음과 같습니다
시간이다 : 1347857063는 [0, 0] : 11.675105 [0, 0 : 임의의 값이 플로트 ] 난수 11 [0,0] 랜덤 값 0.358356 [0, 1] : 11.675105 [0, 1] : 난수 11 [0, 1] : 랜덤 값 0.358356 [인 랜덤 값 플로트 1, 0] : 플로트 랜덤 값 : 63.840496 [1, 0] : 난수 63 [1,0] 랜덤 값은 0.696459 [1,1] : 임의의 값이다 플로트 : 44.712799 [1,1] 난수 44 [1,1] 랜덤 값은 0.735049
CUDA 5.0에서는이 문제를 재현 할 수 없습니다. 나는 당신의 코드를 돌렸고 완전히 다른 4 개의 무작위 값을 만들었다. CUDA 5.0 RC로 업그레이드 할 수 있습니까? 참고'-arch = sm_20'으로 컴파일 했으므로 더 이상'cuPrintf'가 없으므로'printf'를 사용할 수 있습니다. – harrism
CUDA 4.2를 사용 중입니다 ...이 버전의 코드를 실행하고 Nvidia에서 CUDA 5.0 RC를 어디에서 다운로드 할 수 있는지 확인하십시오. – user1439690
[여기 있습니다] (http://developer.nvidia.com/cuda/cuda-pre-production). 그것을 시도하십시오. BTW, Google은 이러한 것들을 찾는 데 아주 능숙합니다. :) – harrism