OpenCL: Что делать, если у меня больше задач, чем доступных рабочих элементов? - PullRequest
0 голосов
/ 30 ноября 2018

Давайте создадим пример:

я хочу, чтобы векторное произведение точек делалось одновременно (это не мой случай, это только пример), поэтому у меня есть 2 больших входных вектора и большой выходной вектор с одинаковым размером.доступные рабочие элементы меньше размеров этих векторов.Как я могу сделать этот точечный продукт в opencl, если рабочие элементы меньше размера векторов?Это возможно?Или мне просто нужно сделать несколько трюков?

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

for(i = 0; i < n; i++){  
    output[i] = input1[i]*input2[i];
}

с n> доступными рабочими элементами

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Разделяй и властвуй данные.Если вы сохраняете размер рабочей группы как целое число, делимое на глобальный размер работы, то вы можете иметь N рабочих групп, запускающих, возможно, k из них за один запуск ядра.Таким образом, вы должны просто запустить N / k ядер, каждое с рабочими элементами k * workgroup_size и правильной адресацией буферов внутри ядер.

Когда у вас есть частичные суммы для каждой рабочей группы продуктов частичных точек (с несколькими шагами сокращения в группе)их можно просто суммировать на процессоре или на любом устройстве, на которое собираются данные.

0 голосов
/ 30 ноября 2018

Если под «доступными рабочими элементами» вы подразумеваете, что вы используете максимум, заданный CL_DEVICE_MAX_WORK_ITEM_SIZES, вы всегда можете поставить ядро ​​в очередь несколько раз для разных диапазонов массива.

В зависимости от вашего фактическогорабочая нагрузка, может быть более разумным, чтобы каждый рабочий элемент выполнял больше работы.В простейшем случае вы можете использовать SIMD-типы, такие как float4, float8, float16 и т. Д., И работать с такими большими кусками за один раз.Тем не менее, как всегда, нет замены для того, чтобы попробовать разные подходы и измерить производительность каждого.

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