从c文件调用cuda-如何操作参数

从c文件调用cuda-如何操作参数,c,cuda,C,Cuda,我有一个cu文件: __device__ float generate( curandState* globalState, int ind ) { curandState localState = globalState[ind]; float RANDOM = curand_uniform( &localState ); globalState[ind] = localState; return RANDOM; } __global__ void

我有一个cu文件:

__device__ float generate( curandState* globalState, int ind ) 
{
    curandState localState = globalState[ind];
    float RANDOM = curand_uniform( &localState );
    globalState[ind] = localState;
    return RANDOM;
}

__global__ void setup_kernel ( curandState * state, unsigned long seed )
{
    int id = threadIdx.x+blockIdx.x*blockDim.x;
    curand_init ( seed, id, 0, &state[id] );
}

__global__ void kernel(float* A,float *B, curandState* globalState, int Asize,int Bsize)
{
     // generate random numbers
     for(int i=0;i<Asize;i++){
       .....
     for (int i=0 ;i<Bsize;i++){
    float k = generate(globalState, i);
    B[i]=k;
    }
}

void kernel_wrapper(float* A,float* B, curandState* globalState, int Asize ,int Bsize)
{
....
    //create random states  
    curandState* devStates;
    cudaMalloc ( &devStates, N*sizeof( curandState ) );

    // setup seeds
    setup_kernel <<< 1, N >>> ( devStates,unsigned(time(NULL)) );

    // copy arrays from host to device
    cudaMemcpy(A_dev, A_host,Asize* sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(B_dev, B_host,Bsize* sizeof(float), cudaMemcpyHostToDevice);

    //generate random numbers
    kernel<<<1,1>>> (A_dev,B_dev, devStates, Asize , Bsize);

    // copy result from device to host
    cudaMemcpy(A_host, A_dev,Asize* sizeof(float), cudaMemcpyDeviceToHost);
    cudaMemcpy(B_host, B_dev,Bsize* sizeof(float), cudaMemcpyDeviceToHost);
 ...
}
我不确定如何处理参数
curandState*globalState
。 我应该如何使用它? 因为我没有使用任何

库兰州


c代码中的值。

[假设其他所有内容都正确]

看起来你的内核包装器根本不需要这个参数。devStates指针是指向生成到
setup\u kernel()
中的随机值种子的指针,该种子随后被传递到
kernel()
,其中应用了分布


简短回答:从发布的代码中,您似乎可以安全地从
内核\u包装中删除
globalState
参数:是的!你说得对,我没注意到!但是,在另一种情况下,我们如何处理它呢?你知道吗?你有什么例子吗?谢谢!这似乎是从源初始化的种子。随机性源是随机数字的生成器(例如,可以从鼠标坐标中提取一些数字的算法)。重要的是:它必须是可靠的随机数,而且它的数字应该很难复制。然后用分布函数对这些随机数进行“加权”,得到一个概率分布,就像你在学习期间可能学习过的概率分布一样。我不熟悉这些代码,但这个过程已经设置好了。另外:如果您想更改分发功能,您应该将curand_uniform更改为适合您需要的其他内容,请查看curand library:好的,谢谢。如果您感兴趣,我还有一个问题:)。
...
extern void kernel_wrapper(float* A,float* B, curandState* globalState, int Asize ,int Bsize)
....
int main()
{
...
 kernel_wrapper(&A,&B, curandState* globalState,Asize ,Bsize)
    ....