PyCUDA GPUArray основанные на срезах операции - PullRequest
2 голосов
/ 19 апреля 2011

Документация PyCUDA немного освещает примеры для тех из нас, кто находится в классе «не-гуру», но мне интересно узнать об операциях, доступных для операций с массивами в gpuarrays, т.е.если бы я хотел gpuarray этот цикл;

m=np.random.random((K,N,N))
a=np.zeros_like(m)
b=np.random.random(N) #example
for k in range(K):
    for x in range(N):
        for y in range(N):
            a[k,x,y]=m[k,x,y]*b[y]

Регулярное сокращение с первым питоном для этого было бы что-то вроде

for k in range(K):
    for x in range(N):
        a[k,x,:]=m[k,x,:]*b

Но я не вижу никакого простого способа сделатьэто с GPUArray, кроме написания пользовательского поэлементного ядра, и даже тогда с этой проблемой должны быть циклические конструкции в ядре, и на этом этапе сложности мне, вероятно, лучше написать простое ядро ​​SourceModule.

Кто-нибудь может подсказать мне?

Ответы [ 2 ]

2 голосов
/ 01 августа 2013

Вы также можете использовать метод memcpy_dtod() и функцию нарезки в gpuarrays.Странно, что обычное назначение не работает.set() не работает, поскольку предполагает передачу хоста на устройство (используя memcpy_htod()).

    for k in range(K):
        for x in range(N):
            pycuda.driver.memcpy_dtod(a[k,x,:].gpudata, (m[k,x,:]*b).gpudata, a[k,x,:].nbytes)
2 голосов
/ 19 апреля 2011

Это, вероятно, лучше всего сделать с вашим собственным ядром. Хотя класс PyCUDA gpuarray - это действительно удобное абстрагирование памяти графического процессора во что-то, что может использоваться взаимозаменяемо с массивными массивами, нет необходимости обходиться без необходимости кодировать графический процессор для чего-либо, кроме стандартной линейной алгебры и операций параллельного сокращения. *

Тем не менее, писать довольно маленькое ядро. Настолько тривиально, что это будет ограничено пропускной способностью памяти - возможно, вы захотите посмотреть, сможете ли вы «объединить» несколько похожих операций, чтобы немного улучшить соотношение FLOPS к транзакциям в памяти.

Если вам нужна помощь с ядром, оставьте комментарий, и я могу расширить ответ, включив грубый прототип.

...