我想生成一組隨機數,只有1和0。下面的代碼幾乎可以工作。當我爲循環打印時,我注意到有時候我有一個數字產生的不是1或0.我知道我錯過了一些東西,只是不知道是什麼。我認爲它是一個記憶錯位。cuda隨機數不總是返回0和1
#include <stdio.h>
#include <curand.h>
#include <curand_kernel.h>
#include <math.h>
#include <assert.h>
#define MIN 1
#define MAX (2048*20)
#define MOD 2 // only need one and zero for each random value.
#define THREADS_PER_BLOCK 256
__global__ void setup_kernel(curandState *state, unsigned long seed)
{
int idx = threadIdx.x+blockDim.x*blockIdx.x;
curand_init(seed, idx, 0, state+idx);
}
__global__ void generate_kernel(curandState *state, unsigned int *result){
int idx = threadIdx.x + blockDim.x*blockIdx.x;
result[idx] = curand(state+idx) % MOD;
}
int main(){
curandState *d_state;
cudaMalloc(&d_state, sizeof(curandState));
unsigned *d_result, *h_result;
cudaMalloc(&d_result, (MAX-MIN+1) * sizeof(unsigned));
h_result = (unsigned *)malloc((MAX-MIN+1)*sizeof(unsigned));
cudaMemset(d_result, 0, (MAX-MIN+1)*sizeof(unsigned));
setup_kernel<<<MAX/THREADS_PER_BLOCK,THREADS_PER_BLOCK>>>(d_state,time(NULL));
generate_kernel<<<MAX/THREADS_PER_BLOCK,THREADS_PER_BLOCK>>>(d_state, d_result);
cudaMemcpy(h_result, d_result, (MAX-MIN+1) * sizeof(unsigned), cudaMemcpyDeviceToHost);
printf("Bin: Count: \n");
for (int i = MIN; i <= MAX; i++)
printf("%d %d\n", i, h_result[i-MIN]);
free(h_result);
cudaFree(d_result);
system("pause");
return 0;
}
我試圖做的是從這個網站轉換遺傳算法。
http://www.ai-junkie.com/ga/intro/gat3.html
我認爲這將是一個很好的問題,以學習CUDA,並有一些樂趣的同時。
第一部分是生成我的隨機數組。
@PaulR:雖然這是真的,但在這種情況下是無關緊要的。隨機生成器的返回值是無符號的,所以模分母被提升爲無符號。沒有負值可以參與模數,並且不會出現意外的行爲。 – talonmies
@talonmies:謝謝 - 我猜錯了 - 我會刪除我的評論。 –