CUDA程序的流程大致如下:
? ? ? ? 假设程序中有两个核函数:kernel1和kernel2
????????kernel2中想要用kernel1 的结果,可kernel2使用的时候值为空,即一个kernel运行的结果没有传递给另外一个kernel使用,那么多个kernel之间的数据应该怎么做才能传递使用??
? ? ? ? ?下边程序中开辟的内存也没有释放,为什么kernel1:initV 时对u0、u1成功赋值之后kernel2:convPy 使用时值却为空呢?
// 先在device开辟内存
cudaMalloc((void**)&u0, mea * wr * sizeof(float));
cudaMalloc((void**)&u1, mea * wr * sizeof(float));
// 通过initV对u0、u1 赋值
initV <<<grid1, block1 >>> (u0, u1, k);
// 同步,确保上边u0、u1成功初始化
cudaDeviceSynchronize();
// convPy函数需要用到u0、u1的值来计算temp
convPy <<<grid22, block22 >>> (temp, u0, u1);
// 最后才释放内存
cudaFree(u0);
cudaFree(u1);
在其他地方看到关于核函数的局限性:?
- CUDA内核程序也没有返回值。
- 它们必须通过设备内存(必须显式地复制回CPU)或映射主机内存来传回结果。?
难道只能使用cudaMemcpy函数吗
????????cudaMemcpy(dst , src , nBytes , cudaMemcpyDeviceToDevice)?
?????????cudaMemcpy(dst , src , nBytes , cudaMemcpyDeviceToHost)?
?????????cudaMemcpy(dst , src , nBytes , cudaMemcpyHostToDevice)?
有没有高效的方法可以使用呢?
还是说核函数之间的数据只能通过上述方法显式的来回传结果才能使用??
近期在做CUDA编程,遇到这个问题,不能解决,若后续解决再来补充。
希望解决了的大佬也能指点我一下,感谢!
|