Монитор производительности GPU с помощью nvprof не работает - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь использовать nvprof для мониторинга производительности графического процессора. Я хотел бы знать, сколько времени занимает HtoD (хост-устройство), DtoH (устройство-хост) и выполнение устройства. Он очень хорошо работал со стандартным кодом с сайта Numba Cuda:

from numba import cuda

@cuda.jit
def add_kernel(x, y, out):
    tx = cuda.threadIdx.x # this is the unique thread ID within a 1D block
    ty = cuda.blockIdx.x  # Similarly, this is the unique block ID within the 1D grid

    block_size = cuda.blockDim.x  # number of threads per block
    grid_size = cuda.gridDim.x    # number of blocks in the grid

    start = tx + ty * block_size
    stride = block_size * grid_size

    # assuming x and y inputs are same length
    for i in range(start, x.shape[0], stride):
        out[i] = x[i] + y[i]

if __name__ == "__main__":
    import numpy as np

    n = 100000
    x = np.arange(n).astype(np.float32)
    y = 2 * x
    out = np.empty_like(x)

    threads_per_block = 128
    blocks_per_grid = 30

    add_kernel[blocks_per_grid, threads_per_block](x, y, out)
    print(out[:10])

Вот результат от nvprfo:

nvprof worked

Однако, когда я добавляю использование многопроцессорной обработки со следующим кодом:

import multiprocessing as mp
from numba import cuda

def fun():

    @cuda.jit
    def add_kernel(x, y, out):
        tx = cuda.threadIdx.x # this is the unique thread ID within a 1D block
        ty = cuda.blockIdx.x  # Similarly, this is the unique block ID within the 1D grid

        block_size = cuda.blockDim.x  # number of threads per block
        grid_size = cuda.gridDim.x    # number of blocks in the grid

        start = tx + ty * block_size
        stride = block_size * grid_size

        # assuming x and y inputs are same length
        for i in range(start, x.shape[0], stride):
            out[i] = x[i] + y[i]

    import numpy as np

    n = 100000
    x = np.arange(n).astype(np.float32)
    y = 2 * x
    out = np.empty_like(x)

    threads_per_block = 128
    blocks_per_grid = 30

    add_kernel[blocks_per_grid, threads_per_block](x, y, out)
    print(out[:10])
    return out


# check gpu condition
p = mp.Process(target = fun)
p.daemon = True
p.start()
p.join()

Кажется, nvprof следит за процессом, но ничего не дает, хотя сообщает, что nvprof профилирует:

nvprof does not record

Кроме того, когда я использовал Ray (пакет для выполнения распределенных вычислений):

if __name__ == "__main__":

    import multiprocessing

    def fun():

        from numba import cuda
        import ray

        @ray.remote(num_gpus=1)
        def call_ray():
            @cuda.jit
            def add_kernel(x, y, out):
                tx = cuda.threadIdx.x # this is the unique thread ID within a 1D block
                ty = cuda.blockIdx.x  # Similarly, this is the unique block ID within the 1D grid

                block_size = cuda.blockDim.x  # number of threads per block
                grid_size = cuda.gridDim.x    # number of blocks in the grid

                start = tx + ty * block_size
                stride = block_size * grid_size

                # assuming x and y inputs are same length
                for i in range(start, x.shape[0], stride):
                    out[i] = x[i] + y[i]

            import numpy as np

            n = 100000
            x = np.arange(n).astype(np.float32)
            y = 2 * x
            out = np.empty_like(x)

            threads_per_block = 128
            blocks_per_grid = 30

            add_kernel[blocks_per_grid, threads_per_block](x, y, out)
            print(out[:10])
            return out


        ray.shutdown()
        ray.init(redis_address = "***")
        out = ray.get(call_ray.remote())

    # check gpu condition
    p = multiprocessing.Process(target = fun)
    p.daemon = True
    p.start()
    p.join()

nvprof ничего не показывает! Он даже не показывает строку, сообщающую, что nvprof профилирует процесс (но код действительно выполняется):

nvprof does not work

Кто-нибудь знает, как это выяснить? Или у меня есть какие-то другие варианты получения этих данных для распределенных вычислений?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...