gpt4 book ai didi

c++ - 具有内部随机函数的结构的 CUDA 移植

转载 作者:太空狗 更新时间:2023-10-29 21:27:24 28 4
gpt4 key购买 nike

我必须在 GPU 上移植一个广泛使用随机数的结构。一切都可以毫无问题地移植,但随机生成器函数是唯一在该类的所有函数中被广泛调用的函数。我虽然可以简单地将它重新实现为类本身的内部设备函数。下面我放了一个我需要的玩具模型(考虑到我工作的类(class)更复杂)。我还需要函数“rand”的每次调用都给出不同的随机数(即使在同一个对象中)。这里是玩具模型,但它会产生错误的结果。谁能帮我改正一下?

#include <cuda.h>
#include <iostream>
#include <curand_kernel.h>
using namespace std;

struct test{

float value;

curandState B;

void __device__ rand(){value=curand_uniform(&B);}
void __device__ foo(){rand();}
};

__global__ void setup_kernel(curandState *state)
{
const int id=blockIdx.x;
curand_init(id, id, 0, &state[id]);
}

__global__ void fill_mat(struct test *anobj, curandState *state)
{
const int Idx=blockIdx.x;
curandState localState = state[Idx];
anobj[Idx].B=localState;
anobj[Idx].foo();
}

int main()
{
int num=10;
curandState *devStates;
cudaMalloc( (void **)&devStates, num*sizeof(curandState) );

struct test *results = (struct test*)malloc(num*sizeof(struct test));
struct test *to_device;
cudaMalloc ( (void **)&to_device, num*sizeof(to_device));

setup_kernel<<<num, 1>>>(devStates);

fill_mat<<<num,1>>>(to_device, devStates);

cudaMemcpy(results,to_device,num*sizeof(struct test),cudaMemcpyDeviceToHost);

for(int i=0;i<num;i++)
cout<<results[i].value<<endl;
return 0;
}

最佳答案

感谢您提供的出色(完整)示例。构建之后我发现了两个问题。

当你 cudaMalloc to_device 你想要分配 num*sizeof(struct test) 字节。

我假设您可能想要多次调用 fill_mat,或者您可能有其他内核并且您希望它们每次都获得不同的数字。如果是这样,在 fill_mat(或复制 curandState 的其他内核)结束时,您需要将本地状态复制回 curandState。这是因为每次生成数字时,curand 都会推进状态。

最后(这不一定是错误)我看到您在调用 curand_init 时使用线程 ID 作为种子和序列。这没关系,但存在一些(极不可能)风险,即 curand 的种子加扰算法会使您进入与其他线程重叠的序列的一部分。 curand_init 使用种子的加扰版本生成初始状态,然后应用 2*67 倍序列的 skipahead。通常,目的是所有线程都使用相同的种子,以保证每个线程在序列内与前一个线程相距 2*67。

保罗。

关于c++ - 具有内部随机函数的结构的 CUDA 移植,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117071/

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