Проблема производительности OpenCL на GPU

Я нашел это решение хорошим. (Это использует расширение python-dateutil )

from datetime import date
from dateutil.relativedelta import relativedelta

six_months = date.today() + relativedelta(months=+6)

Преимущество такого подхода состоит в том, что он заботится о проблемах с 28, 30, 31 днями и т. Д. Это становится очень полезно при обработке бизнес-правил и сценариев (например, генерация счета и т. д.)

$ date(2010,12,31)+relativedelta(months=+1)
  datetime.date(2011, 1, 31)

$ date(2010,12,31)+relativedelta(months=+2)
  datetime.date(2011, 2, 28)

3
задан André Aguiar 13 March 2019 в 15:54
поделиться

2 ответа

Кроме того, что все остальные говорили в комментариях, согласно автору реализации RPCL OpenCL, «скорость доступа к памяти» для GPU (копия памяти CPU-GPU?) Намного медленнее, чем для CPU. Таким образом, «арифметически легкое» ядро, такое как сумма массива, будет ограничено пропускной способностью памяти и может быть намного медленнее, чем на процессоре. Плюс теоретические GFlops для GPU не намного выше, чем у GPU (24 против 6).

Если у вас нет очень вычислительно тяжёлых ядер, которые также могут быть полностью векторизованы, вы можете обнаружить, что использование GPU просто не стоит.

0
ответ дан mogu 13 March 2019 в 15:54
поделиться

Я не знаком с этим конкретным графическим процессором, но несколько вещей, которые выделяются как возможные красные флаги в вашем коде:

  • Это целочисленный код ALU, а не операции с плавающей запятой. , Многие графические процессоры вообще не оптимизированы для этого.
  • Я бы не стал полагаться на то, что компилятор оптимизирует вычисления смещения массива; особенно глупый компилятор может выдавать 3 целочисленных умножения для C[index + k * WIDTH] = A[index + k * WIDTH] + B[index + k * WIDTH]; на каждой итерации цикла. Я бы сохранял смещение в переменной и добавлял к нему на каждой итерации, умножение не требовалось.
  • 1000-итерация для цикла обычно выделяется как потенциальный источник лучшего параллелизма. Многие GPU плохо работают с долго работающими ядрами.
  • Шаблоны доступа к памяти кажутся неоптимальными. Попробуйте расположить так, чтобы смежные рабочие элементы в группе обращались к смежным ячейкам памяти. Локальный размер 2x2x2 кажется особенно плохим выбором. Вы пробовали 12x1x1?
  • Почему вы даже упорядочиваете рабочие элементы таким образом? Похоже, вы буквально рассчитываете C[i] = A[i] + B[i] для i = 0..1000*12*12*12. Как насчет написания вашего ядра именно так и представления 1728000 рабочих элементов в одном измерении? Это экономит на всех сложных расчетах индекса.

Если вы можете получить какие-либо отзывы от драйверов о том, с чем связан графический процессор (ALU, загрузка памяти, планирование потоков и т. Д.), Это очень поможет при выборе места для поиска. способы ускорить его.

0
ответ дан pmdj 13 March 2019 в 15:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: