PyCuda - Как я могу использовать функции, написанные на Python в ядре? - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу распараллелить мой код Python и пытаюсь использовать PyCuda.До сих пор я видел, что вы должны написать «Ядро» в C в своем коде Python.Это Ядро - это то, что будет распараллелено.Я прав?Пример (удвоение массива случайных чисел из https://documen.tician.de/pycuda/tutorial.html):

import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy
a = numpy.random.randn(4, 4)
a = a.astype(numpy.float32)
a_gpu = cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu, a)
# Kernel:
mod = SourceModule("""
  __global__ void doublify(float *a)
  {
    int idx = threadIdx.x + threadIdx.y*4;
    a[idx] *= 2;
  }
  """)
func = mod.get_function("doublify")
func(a_gpu, block=(4, 4, 1))
a_doubled = numpy.empty_like(a)
cuda.memcpy_dtoh(a_doubled, a_gpu)

print(a_doubled)
print(a)

Дело в том, что в моем коде Python есть классы и другие вещи, подходящие для Python и не подходящие для C (т.е. непереводимые для C).

Позвольте мне уточнить: у my есть 256 независимых циклов for, которые я хочу распараллелить. Эти циклы содержат код Python, который нельзя преобразовать в C.

Как я могу распараллелить фактический код Pythonс PyCuda без перевода моего кода на C?

1 Ответ

0 голосов
/ 20 марта 2019

Вы не можете.

PyCUDA не поддерживает Python на стороне устройства, весь код устройства должен быть написан на диалекте CUDA C.

Numba включает прямой компилятор Python, который позволяет компилировать и запускать крайне ограниченное подмножество функций языка Python непосредственно на GPU.Это не включает доступ к любым библиотекам Python, таким как numpy, scipy и т. Д.

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