Pycuda DeviceMemoryPool и gpuarray.to_gpu_async не работают должным образом
Кажется, мне не удается достичь параллелизма с кодом ниже:
#!/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 в любой точке, как это произошло бы, если бы был достигнут параллелизм. Тем не менее, несмотря на то, что обе команды GPU (gpuarray.to_gpu_async () и some_long_running_kernel ()) оба являются предоставляемыми потоками).