我们可以在CUDA内核中使用printf或任何其他类似的函数吗?

我们可以在CUDA内核中使用printf或任何其他类似的函数吗?,cuda,gpgpu,gpu,Cuda,Gpgpu,Gpu,我的矩阵加法示例: __global__ void matrix_add(float *a, float*b, float *c, int N) { int index; int Row = blockIdx.y * blockDim.y + threadIdx.y; int Col = blockIdx.x * blockDim.x + threadIdx.x; int index = Row * N + Col; // N is the orde

我的矩阵加法示例:

 __global__ void matrix_add(float *a, float*b, float *c, int N)
{
    int index;
    int Row = blockIdx.y * blockDim.y + threadIdx.y;
    int Col = blockIdx.x * blockDim.x + threadIdx.x;

    int index = Row * N + Col;      // N is the order of the square matrix

    cd[index]= ad[index] + bd[index];

}
我可以在上面的内核中使用printf或任何其他类似的函数吗?这样我就不需要将数据从设备传输到主机内存(即cudaMemcpyDeviceToHost)。如果是,那怎么办?如果没有,那么为什么不呢?

您可以使用printf(..),但只能用于cc2.x或更高版本。

您可以在CUDA编程指南附录B.16中了解更多信息。

显示内核结果而不将数据复制回主机的唯一方法是使用图形互操作性模式之一。CUDA支持OpenGL和Direct3D互操作性。CUDA编程指南中有关于如何使用这些的示例

\uuuu device\uuuuuuuu printf()
(关于计算能力>=2.0)和
\uuuuuuuu device\uuuuuuuuuuuu printf()
(关于计算能力<2.0))都会导致打印字符串隐式复制回主机。很可能,这两种情况都会导致所有试图同时打印的内核的隐式序列化,因此通常仅用于调试

如果在调试器中运行CUDA应用程序,则在调试器中查看的设备值也已隐式复制到主机

您的问题不清楚您是想避免将值复制回主机,还是只想避免将值显式复制到主机上。如果是后者,那么
\uuuu device\uuuu printf()
方法对于在主机上显示少量结果是可行的。避免显式复制值的另一种方法是使用
推力::设备\u向量。推力是CUDA附带的一个库。它是由C++ STL的启发。您可以在主机端读取和写入
设备\u向量
,并在后台执行与设备之间的隐式复制

您还可以使用所谓的映射内存来导致隐式复制。使用映射内存,CUDA硬件可以根据内核的需要在主机和设备之间执行内存的隐式复制

这一切的原因是主机和设备之间的拷贝非常昂贵。通常,它们占用了总计算时间的很大一部分。因此,有必要仔细考虑这些拷贝何时和如何发生。我提到的所有技术都有不同的性能影响,如何最好地处理复制是特定于应用程序的