gpt4 book ai didi

c++ - cuda随机数并不总是返回0和1

转载 作者:行者123 更新时间:2023-11-30 01:44:09 25 4
gpt4 key购买 nike

我正在尝试生成一组随机数,其中只有 1 和 0。下面的代码几乎可以工作。当我执行 print for 循环时,我注意到有时我生成的数字不是 1 或 0。我知道我错过了一些东西,只是不确定是什么。我认为这是内存错位。

#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 并同时享受一些乐趣会是一个很好的问题。

第一部分是生成我的随机数组。

最佳答案

这里的问题是您的 setup_kernelgenerate_kernel 都没有运行完成,因为内存访问越界。两个内核都期望每个线程都有一个生成器状态,但您只在设备上分配一个状态。这会导致两个内核上的内存读写越界。改变这个:

curandState *d_state;
cudaMalloc(&d_state, sizeof(curandState));

类似于

curandState *d_state;
cudaMalloc(&d_state, sizeof(curandState) * (MAX-MIN+1));

这样你运行的每个线程都有一个生成器状态,事情应该开始工作了。如果您曾尝试通过运行时 API 返回状态或使用 cuda-memcheck 检查错误,错误的来源将立即显而易见。

关于c++ - cuda随机数并不总是返回0和1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com