Я очень старался ускорить некоторые простые операции линейной алгебры в моей симуляции.Существует узкое место во время выполнения, когда умножение матрицы на матрицу, а затем операция трассировки выполняются в цикле.Чтобы протестировать pyculib.blas, я написал следующую программу
from numba import cuda
import numpy as np
from pyculib import blas
from time import time
dtp = 'float32'
sz = 5000
A = np.random.rand(sz,sz).astype(dtp)
B = np.random.rand(sz,sz).astype(dtp)
C = np.empty(A.shape, dtype=dtp)
start = time()
C = A.dot(B)
print(time()-start)
print()
ctx = cuda.select_device(0)
adev = cuda.to_device(A)
bdev = cuda.to_device(B)
cdev = cuda.to_device(C)
start = time()
blas.gemm('N', 'N', 1.0, adev, bdev, 0.0, cdev)
print(time()-start)
Проблема № 1: время выполнения для numpy.dot составляет 0,383 секунды, время для Blas составляет 1,89 секунды.Возможно, умножение матриц не выполняется должным образом на GPU.Я ожидаю время выполнения ~ 1E-3 секунды на основе cupy и MATLAB.
Проблема № 2: Если я сделаю размер матрицы 10 000 x 10 000, я получу следующую ошибку памяти от CUDA: CudaAPIError: Callк cuMemcpyDtoH приводит к CUDA_ERROR_LAUNCH_FAILED
Теперь, если я использую Cupy, я могу заставить матричное умножение работать очень быстро и получит матрицы 10K x 10K.НО Cupy имеет некоторые проблемы с совместимостью, из-за которых многие из его операций не работают (прослеживаются среди них).Возможно, эту проблему лучше всего сохранить для другого потока.
В любом случае, может ли кто-нибудь, имеющий опыт работы с пикулибом, понять, что вызывает вышеупомянутые проблемы?Я не хочу использовать MATLAB.Я использую Anaconda в Windows 10.