Pycuda DeviceMemoryPool и gpuarray.to_gpu_async не работают должным образом - PullRequest
0 голосов
/ 23 декабря 2018

Кажется, я не смог достичь параллелизма с кодом ниже:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
import pandas as pd
import pycuda.autoinit
import pycuda.driver as drv
import pycuda.gpuarray as gpuarray
from pycuda.tools import DeviceMemoryPool as DMP
from pycuda.compiler import SourceModule

data_DevMemPool = DMP()
some_long_running_kernel = SourceModule(some_long_running_kernel_SRC, no_extern_c=True)

stream = []

for k in range (10):
    stream.append(drv.Stream())

numpy_data = np.zeros((2048,4000)).astype(np.float32)    


#Why won't this parallelize?:
for i in range(10):
    gpu_data = gpuarray.to_gpu_async(numpy_data,allocator = data_DevMemPool.allocate,stream=stream[i] )

    some_long_running_kernel(
                gpu_data,
                block=(1024,1,1),grid=(2,1,1),stream=stream[i] )

Последующее выполнение:

    data_DevMemPool.held_blocks
    data_DevMemPool.active_blocks

показывает значения 1 и 1 соответственно, предлагая пул памяти устройстване был расширен за 1 в любой точке, как это произошло бы, если бы был достигнут параллелизм.Тем не менее, несмотря на то, что обе инструкции для графического процессора ( gpuarray.to_gpu_async () и some_long_running_kernel () ) являются предоставляемыми потоками).

...