Я нашел это решение хорошим. (Это использует расширение 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)
Кроме того, что все остальные говорили в комментариях, согласно автору реализации RPCL OpenCL, «скорость доступа к памяти» для GPU (копия памяти CPU-GPU?) Намного медленнее, чем для CPU. Таким образом, «арифметически легкое» ядро, такое как сумма массива, будет ограничено пропускной способностью памяти и может быть намного медленнее, чем на процессоре. Плюс теоретические GFlops для GPU не намного выше, чем у GPU (24 против 6).
Если у вас нет очень вычислительно тяжёлых ядер, которые также могут быть полностью векторизованы, вы можете обнаружить, что использование GPU просто не стоит.
Я не знаком с этим конкретным графическим процессором, но несколько вещей, которые выделяются как возможные красные флаги в вашем коде:
C[index + k * WIDTH] = A[index + k * WIDTH] + B[index + k * WIDTH];
на каждой итерации цикла. Я бы сохранял смещение в переменной и добавлял к нему на каждой итерации, умножение не требовалось. C[i] = A[i] + B[i]
для i = 0..1000*12*12*12
. Как насчет написания вашего ядра именно так и представления 1728000 рабочих элементов в одном измерении? Это экономит на всех сложных расчетах индекса. Если вы можете получить какие-либо отзывы от драйверов о том, с чем связан графический процессор (ALU, загрузка памяти, планирование потоков и т. Д.), Это очень поможет при выборе места для поиска. способы ускорить его.