来自CUPTI的Python事件

时间:2019-05-08 18:07:22

标签: python c cuda

我需要不断从运行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。

谢谢。

0 个答案:

没有答案