Что делать, если у меня больше заданий, чем SIZE_MAX в OpenCL - PullRequest
0 голосов
/ 09 июля 2020

Моя программа OpenCL включает около 7 миллиардов рабочих элементов. В моей программе на C ++ я бы установил это в my global_item_size:

size_t global_item_size = 7200000000;

Если моя программа скомпилирована для 64-битных систем (x64), этот глобальный размер в порядке, поскольку SIZE_MAX (максимальное значение size_t ) намного превышает 7 миллиардов. Однако для обеспечения обратной совместимости я хочу убедиться, что моя программа может компилироваться в 32-битные системы (x86). В 32-битных системах SIZE_MAX составляет около 4 миллиардов, что меньше моего глобального размера, 7 миллиардов. Если я попытаюсь установить глобальный размер на 7 миллиардов, это приведет к переполнению. Что я могу сделать в этом случае?

Одним из решений, о котором я думал, было создание многомерного глобального и локального размера. Однако это решение требует, чтобы ядро ​​вычисляло исходный глобальный размер (потому что мое ядро ​​сильно зависит от глобального и локального размера), что приведет к потере производительности.

* 1007 ядра. Я думаю, что это решение было бы немного «неаккуратным», и синхронизация ядер тоже не была бы лучшим решением. чем максимальный размер size_t? Если это невозможно, какие обходные пути?

Ответы [ 2 ]

1 голос
/ 30 июля 2020

Если вы хотите избежать пакетов, вы можете дать каждому ядру больше работы, но эффективно обернуть код в l oop. Например,

for (int i = 0; i < WORK_ITEMS_PER_THREAD; ++i)
{
    size_t id = WORK_ITEMS_PER_THREAD * get_global_id(0) + i;

    ...
}
1 голос
/ 24 июля 2020

Попробуйте использовать uint64_t global_item_size = 7200000000ull;, чтобы избежать переполнения 32-битных целых чисел.

Если вы строго ограничены максимальным 32-битным количеством рабочих элементов, вы можете выполнить вычисления несколькими партиями (обмен на GPU буферы между этапами вычислений посредством передачи P CIe), или вы можете упаковать несколько элементов данных в один поток графического процессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...