我需要不断从运行Python代码的GPU读取事件。 要从GPU读取事件,我正在使用CUPTI(https://developer.nvidia.com/CUPTI)。我编写了一个C语言库,该库产生了一个线程,并开始从GPU中读取事件。 据我所知,这是连续读取事件的唯一方法,因为CUPTI需要处于与运行CUDA代码相同的进程中。
然后,我有一个在GPU上运行的Python代码,我正在尝试使用我的库。 我正在用ctypes在Python代码中调用我的C库。 CUPTI采样线程正确生成,但读数始终为0(当CUPTI线程与运行CUDA代码的线程不同时,会发生这种情况。)
以下代码是我尝试在运行时进行概要分析的Python代码。 前三行是当我加载我的C库并生成运行CUPTI代码的线程时。 Python示例来自此处(https://medium.com/3blades-blog/an-introduction-to-gpu-programming-with-python-637818be6f7d)
import ctypes
func = ctypes.CDLL("libutils.so")
func.spawnCUPTI()
import numpy
import pycuda.autoinit
import pycuda.driver as drv
from pycuda.compiler import SourceModule
# SourceModule compiles C code for CUDA
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
const int i = threadIdx.x; dest[i] = a[i] * b[i];
}
""")
multiply_them = mod.get_function("multiply_them")
a = numpy.random.randn(400000).astype(numpy.float32)
b = numpy.random.randn(400000).astype(numpy.float32)
dest = numpy.zeros_like(a)
# Perform the computation
multiply_them( drv.Out(dest), drv.In(a), drv.In(b), block=(400,1,1), grid=(1,1))
print (dest-a*b)
此外,nvprof应用程序(NVIDIA官方配置文件应用程序之一)在Python代码执行结束时可以正确报告事件。但是,它不支持连续采样。
在C应用程序中,我能够连续从GPU读取事件。 不确定问题出在Python和CUPTI,还是ctypes和CUPTI。
谢谢。