Ваш размер блока неверен. Устройства CUDA имеют ограничение из 1024 потоков на блок. Когда я запускаю ваш код, я вижу это:
/opt/miniconda3/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py in _check_error(self, fname, retcode)
327 _logger.critical(msg, _getpid(), self.pid)
328 raise CudaDriverError("CUDA initialized before forking")
--> 329 raise CudaAPIError(retcode, msg)
330
331 def get_device(self, devnum=0):
CudaAPIError: [1] Call to cuLaunchKernel results in CUDA_ERROR_INVALID_VALUE
Когда я исправляю это, я вижу это:
$ cuda-memcheck python somethingsometing.py
========= CUDA-MEMCHECK
========= Invalid __shared__ read of size 4
========= at 0x000008b0 in cudapy::__main__::mm$241(Array<int, int=2, A, mutable, aligned>, Array<int, int=2, A, mutable, aligned>, Array<int, int=2, A, mutable, aligned>)
========= by thread (15,11,0) in block (3,2,0)
========= Address 0x00000ec0 is out of bounds
Почему это довольно очевидно:
for i in range(a.shape[1]):
sum += a_cache[row][i] * b_cache[i][column]
row
и column
являются измерениями в сетке выполнения, а не плиткой локальной общей памяти, и аналогично i
ограничен формой a
, а не формой a_cache
(обратите внимание, что вы, похоже, пропустите синтаксис индексации двумерного массива в стиле C примерно на полпути кода, что является потенциальной ошибкой, если вы не понимаете разницу между ними в Python).
Чтобы исправить это, вы будете необходимо изменить индексирование и затем реализовать остальную часть кода для умножения (то есть вы должны итеративно загружать целые строки и срезы столбцов через локальные общие тайлы, чтобы вычислить произведение полной точки для каждой пары строк / столбцов, которую будет обрабатывать блок) .
Также обратите внимание, что
- Размеры, выбранные вами для
c
, неверны (должно быть mxm) - Размер сетки, на которой вы запускаете ядро, равен также неправильно, потому что размеры C неверны, и поэтому ваш код никогда не сможет рассчитать всю матрицу
- Даже после исправления всего этого, вполне вероятно, что результаты умножения будут неверными при любых других значениях, кроме тривиальных размеров, потому что целочисленного переполнения.