从c文件调用cuda-如何操作参数
我有一个cu文件:从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
__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)
....