Как преобразовать функцию python "any ()" в код, совместимый с CUDA python (работающий на GPU)? - PullRequest
0 голосов
/ 16 сентября 2018

Мне интересно, как реализовать функцию numpy any() на графическом процессоре (с использованием Numba Python). Функция any () принимает массив и возвращает True, если хотя бы один из элементов ввода оценивается как True.

Что-то вроде:

@vectorize(["boolean(boolean)"], target='cuda')
def AnyFunction(a):
    return any(a)

или

@vectorize(["boolean(boolean)"], target='cuda')
def AnyFunction(a):
    for i in range(len(a)):
        if a[i]==True:
            return True
    return False

1 Ответ

0 голосов
/ 17 сентября 2018

Более сложным аспектом (возможно) работы функции any является аспект сокращения.Проверка каждого элемента на истину / ложь - это операция, которую можно легко выполнить, например, с помощью vectorize, но объединение многих результатов в одно значение (аспект сокращения) не может (легко);на самом деле vectorize не был предназначен для решения такого рода проблем, по крайней мере, напрямую.

Но numba cuda предоставляет некоторую помощь для простых задач сокращения (таких как эта), не заставляя васнаписать собственное ядро ​​numba cuda. ​​

Вот один из возможных методов:

$ cat t20.py
import numpy
from numba import cuda

@cuda.reduce
def or_reduce(a, b):
    return a or b

A = numpy.ones(1000, dtype=numpy.int32)
B = numpy.zeros(1000, dtype=numpy.int32)
expect = A.any()      # numpy reduction
got = or_reduce(A)   # cuda reduction
print expect
print got
expect = B.any()      # numpy reduction
got = or_reduce(B)   # cuda reduction
print expect
print got
B[100] = 1
expect = B.any()      # numpy reduction
got = or_reduce(B)   # cuda reduction
print expect
print got

$ python t20.py
True
1
False
0
True
1
$

Несколько замечаний по поводу производительности:

  1. Это, вероятно, не самый быстрыйспособ выполнить эту операцию.Но у вас сложилось впечатление, что вы ищете что-то похожее на обычный python.
  2. Написание собственного ядра CUDA в numba , вероятно, может выполнить эту работу быстрее.
  3. Если вы серьезно относитесь к производительности, то рекомендуется попробовать объединить эту операцию с другой работой, выполняемой на графическом процессоре.В этом случае для большей гибкости пользовательское ядро ​​даст вам больше возможностей для выполнения задачи с максимальной производительностью.
...