Если я правильно понимаю, если я поставлю по одной точке в каждое ядро графического процессора, общее количество точек, которые я могу обработать за один раз, составит 36 × 256 = 9 × 1024 = 9216.
Не совсем. Общее количество точек не ограничено максимальным размером рабочей группы. Размер рабочей группы - это количество потоков графического процессора, работающих синхронно в группе. Внутри рабочей группы вы можете обмениваться данными через локальную память, что может быть полезно для ускорения определенных вычислений, таких как, например, умножение матриц (разбиение кеша). столько же независимых частей, сколько есть. В C ++ что-то вроде
void example(float* data, const int N) {
for(int n=0; n<N; n++) {
data[n] += 1.0f;
}
}
в OpenCL становится таким
kernel void example(global float* data ) {
const int n = get_global_id(0) ;
data[n] += 1.0f;
}
, где глобальный диапазон ядра установлен на N
.
Каждый поток графического процессора должен обрабатывать только одну точку. Количество потоков (глобальный диапазон) может и должно быть намного больше, чем количество доступных ядер графического процессора. Если вам явно не нужна локальная память (все потоки могут работать независимо), вы можете установить размер локальной рабочей группы 32, 64, 128 или 256 - это не имеет значения - но между ними может быть некоторая разница в производительности ценности. Однако глобальный диапазон (общее количество потоков / точек) должен быть кратным размеру рабочей группы.
Что, если задача больше, чем может вместить графический процессор?
Я полагаю, вы имеете в виду, когда ваш набор данных не помещается в видеопамять сразу. В этом случае вы можете выполнять вычисления несколькими партиями, поэтому замените буферы графического процессора, используя передачи P CIe. Но это приводит к значительному снижению производительности.
Конечно, я хочу, чтобы этот код работал на других графических процессорах, кроме моего. Я собираюсь использовать OpenCL для переносимости. С какими разными графическими процессорами (описание, а не название) я столкнусь?
OpenCL отлично подходит для переносимости между устройствами и операционными системами. Помимо графических процессоров и процессоров AMD, вы встретите графические процессоры Nvidia, которые поддерживают только OpenCL 1.2, а также графические процессоры и процессоры Intel. Если графические драйверы установлены, ваш код будет работать на всех без проблем. Просто имейте в виду, что объем видеопамяти может сильно отличаться.