【发布时间】:2014-02-26 12:49:20
【问题描述】:
我正在使用一个生成随机数的 cu 文件。
...
__global__ void kernel(double* A,double *B, curandState* globalState,int Asize,int Bsize)
{...
void kernel_wrapper(double** A_host,double** B_host, int Asize ,int Bsize)
{
int N=1000; // random numbers
//create random states
curandState* devStates;
gpuErrchk(cudaMalloc(&devStates,N*sizeof(curandState)));
//allocate host memory
*A_host=(double*)malloc(Asize*sizeof(double));
*B_host=(double*)malloc(Bsize*sizeof(double));
//allocate device memory
double* A_dev,*B_dev;
gpuErrchk(cudaMalloc((void**) &A_dev,Asize* sizeof(double)));
gpuErrchk(cudaMalloc((void**) &B_dev,Bsize* sizeof(double)));
// setup seeds
setup_kernel<<<1,N>>>(devStates,unsigned(time(NULL)));
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaDeviceSynchronize() );
//define threads and blocks
const int NUM_BLOCKS=16;
const int NUM_THREADS=256;
dim3 dimGrid(NUM_BLOCKS);
dim3 dimBlock(NUM_THREADS);
//generate random numbers
kernel<<<1,1>>>(A_dev,B_dev,devStates,Asize,Bsize);
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaDeviceSynchronize() );
// copy result from device to host
gpuErrchk(cudaMemcpy(*A_host, A_dev,Asize* sizeof(double), cudaMemcpyDeviceToHost));
gpuErrchk(cudaMemcpy(*B_host, B_dev,Bsize* sizeof(double), cudaMemcpyDeviceToHost));
//clean up device memory
gpuErrchk(cudaFree(A_dev));
gpuErrchk(cudaFree(B_dev));
gpuErrchk(cudaFree(devStates));
}
然后,我从 cpp 文件中加载这些值并将它们用作函数的参数。
...
extern void kernel_wrapper(double** A,double** B, int Asize ,int Bsize);
...
int main()
{
...
kernel_wrapper(&A,&B,Asize ,Bsize);
...
myfunction(...A,B)
...
free(A);
free(B);
如何最大程度地减少数据传输并将工作主要在设备中完成? 因为现在我正在分配主机内存并将其传递给 cpp 文件。 我不知道如何传递设备内存?
【问题讨论】:
-
如果您所做的只是在设备上生成随机数,然后在主机代码 (
myfunction) 中使用它们,那么您将无法比现有的更好在传递数据方面。您的myfunction位于 .cpp 文件中,可能是为了使用主机代码而编写的,因此没有必要将驻留在设备上的数据传递给它。 -
@Robert Crovella:嗯..我想你是对的。如果我可以从 cu 文件中调用该函数,我可以尝试的唯一可能性..
-
@Robert Crovella:我开了一个新帖子stackoverflow.com/questions/22064072/how-to-use-the-cula-device。我想使用设备内存,但不知道如何通过。
标签: cuda