Медленное сравнение GPU в Cupy - PullRequest
       31

Медленное сравнение GPU в Cupy

0 голосов
/ 19 февраля 2019

Я хочу проверить с помощью cupy, является ли число с плавающей точкой положительным, например:

import cupy as cp

u = cp.array(1.3)
u < 2.
>>> array(True)

Моя проблема в том, что эта операция очень медленная: %timeit u < 2. дает 26 микросекунд на моем компьютере.Это на несколько порядков больше, чем то, что я получаю в процессоре.Я подозреваю, что это потому, что вы должны быть наложены на процессор ...

Я пытаюсь найти более быстрый способ сделать эту операцию.

Спасибо!

Редактировать для уточнения

Мой код выглядит примерно так:

import cupy as cp
n = 100000
X = cp.random.randn(n)  # can be greater
for _ in range(100):  # There may be more iterations
    result = X.dot(X)
    if result < 1.2:
        break

И, похоже, узким местом этого кода (для этого n) является оценкаresult < 1.2.Это все еще намного быстрее, чем на процессоре, так как dot стоит намного дешевле.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Выполнение одной операции на графическом процессоре всегда плохая идея.Чтобы получить прирост производительности от вашего графического процессора, вам необходимо реализовать хорошую «интенсивность вычислений»;то есть количество вычислений, выполненных относительно движения памяти;либо из глобального ram в gpu mem, либо из gpu mem в сами ядра.Если у вас нет как минимум нескольких провальных флопов на байт вычислительной интенсивности, вы можете смело забыть о любом ускорении графического процессора.Тем не менее, ваша проблема может быть связана с ускорением графического процессора, но вы, конечно, не можете тестировать подобные заявления изолированно каким-либо осмысленным образом.

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

0 голосов
/ 16 августа 2019

Я думаю, что проблема в том, что вы просто используете одно устройство с графическим процессором.Попробуйте использовать скажем 100 для параллельного выполнения всех вычислений for (хотя в случае вашего простого примера кода это нужно будет выполнить только один раз).https://docs -cupy.chainer.org / ru / stable / tutorial / basic.html

Кроме того, имеется функция с расширенными возможностями, которую можно использовать для сравнения в графическом процессоре * 1006.*

Также при первом вызове точки функция ядра должна быть скомпилирована для GPU, что займет значительно больше времени, чем последующие вызовы.

0 голосов
/ 19 февраля 2019

Это может быть связано с тем, что при использовании CUDA массив должен быть скопирован в графический процессор перед обработкой.Поэтому, если ваш массив имеет только один элемент, он может быть медленнее в графическом процессоре, чем в процессоре.Вы должны попробовать больший массив и посмотреть, будет ли это происходить

...