【问题标题】:call cuda from c file - how to manipulate an argument从 c 文件调用 cuda - 如何操作参数
【发布时间】:2014-02-14 13:26:01
【问题描述】:

我有一个 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);
 ...
}

现在,在 c 代码中:

...
extern void kernel_wrapper(float* A,float* B, curandState* globalState, int Asize ,int Bsize)
....
int main()
{
...
 kernel_wrapper(&A,&B, curandState* globalState,Asize ,Bsize)
    ....

我不确定如何处理参数curandState* globalState。 我应该如何使用它? 因为我没有使用任何

curandState

c 代码中的值。

【问题讨论】:

    标签: c cuda


    【解决方案1】:

    [假设其他一切都正确]

    看来您的 kernel_wrapper 根本不需要该参数。 devStates 指针是指向生成到setup_kernel() 中的随机值种子的指针,该种子随后被传递到应用分布的kernel()

    简短回答:从发布的代码看来,您可以安全地从 kernel_wrapper 中删除 globalState 参数

    【讨论】:

    • :是的!你说得对,我没注意到!但是,在另一种情况下,我们如何处理它?你知道吗?你有任何例子吗?谢谢!
    • 这似乎是从源初始化的种子。随机源是随机数的生成器(例如,可以从鼠标坐标中提取一些数字的算法)。重要的是:它必须是可靠随机的,并且它的数字应该难以重现。然后这些随机数被分布函数“加权”,以获得一个概率分布,就像你在学年期间可能学习的那样。我不熟悉那个代码,但这个过程已经设置好了。
    • 另外:如果你想改变你的分布函数,你应该改变 curand_uniform 来满足你的需要,看看 CURAND 库docs.nvidia.com/cuda/pdf/CURAND_Library.pdf
    • :好的,谢谢。如果你有兴趣,我还有一个问题:) .stackoverflow.com/questions/21783216/…
    猜你喜欢
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多