Развертывание тривиально распараллеливаемого цикла for в python с помощью CUDA

У меня есть цикл for в python, который я хочу развернуть на GPU. Я предполагаю, что должно быть простое решение, но я его еще не нашел.

Наша функция перебирает элементы в массиве numpy и выполняет некоторые математические операции, сохраняя результат в другом массиве numpy. Каждая итерация добавляет некоторые значения в этот массив результатов. Возможное большое упрощение нашего кода может выглядеть примерно так:

import numpy as np

a = np.arange(100)
out = np.array([0, 0])
for x in xrange(a.shape[0]):
  out[0] += a[x]
  out[1] += a[x]/2.0

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


person deltap    schedule 04.04.2014    source источник
comment
А ваш вопрос?   -  person talonmies    schedule 04.04.2014
comment
Как развернуть цикл на GPU в python. Какие библиотеки я должен использовать и какие вызовы функций.   -  person deltap    schedule 04.04.2014
comment
Вы проверили документацию pycuda?   -  person usethedeathstar    schedule 04.04.2014


Ответы (1)


Начать следует с http://documen.tician.de/pycuda/.

import pycuda.autoinit
import pycuda.driver as drv
import numpy

from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
  const int i = threadIdx.x;
  dest[i] = a[i] * b[i];
}
""")

multiply_them = mod.get_function("multiply_them")

a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)

dest = numpy.zeros_like(a)
multiply_them(
        drv.Out(dest), drv.In(a), drv.In(b),
        block=(400,1,1), grid=(1,1))

print dest-a*b

Вы помещаете часть кода, которую хотите распараллелить, в сегмент кода C и вызываете ее из python.

Например, размер ваших данных должен быть намного больше 100, чтобы это стоило того. Вам понадобится какой-то способ разделить ваши данные на блоки. Если вы хотите добавить 1 000 000 чисел, вы можете разделить его на 1000 блоков. Добавьте каждый блок в распараллеленный код. Затем добавьте результаты в python.

Добавление элементов не является естественной задачей для такого типа распараллеливания. Графические процессоры, как правило, выполняют одну и ту же задачу для каждого пикселя. У вас есть задача, которая должна работать с несколькими пикселями.

Возможно, лучше сначала поработать с cuda. Связанная тема есть. Понимание размеров сетки CUDA, размеров блоков и организации потоков (простой объяснение)

person Salix alba    schedule 04.04.2014