Устройство OpenCL CPU против устройства GPU

Рассмотрим простой пример: добавление вектора.

Если я создаю программу для CL_DEVICE_TYPE_GPU, и я строю ту же программу для CL_DEVICE_TYPE_CPU, в чем разница между ними (кроме того, что "CPU program" работает на CPU, а "GPU-программа" работает на GPU)?

Спасибо за вашу помощь.

Ответ 1

Существует несколько различий между типами устройств. Простой ответ на ваш векторный вопрос: используйте gpu для больших векторов и cpu для меньших рабочих нагрузок.

1) Копирование памяти. Графические процессоры полагаются на данные, над которыми вы работаете, чтобы их передавать, и результаты позже считываются на хост. Это делается по PCI-e, что дает около 5 ГБ/с для версии 2.0/2.1. ЦП могут использовать буферы "на месте" - в DDR3 - используя флаги CL_MEM_ALLOC_HOST_PTR или CL_MEM_USE_HOST_PTR. См. Здесь: clCreateBuffer. Это одно из больших узких мест для многих ядер.

2) Тактовая частота. В настоящее время cpus имеет большое преимущество по сравнению с gpus в тактовой частоте. 2 ГГц на нижнем конце для большинства процессоров, против 1 ГГц в качестве верхнего конца для большинства gpus в эти дни. Это один из факторов, который действительно помогает процессору "выигрывать" над gpu для небольших рабочих нагрузок.

3) Параллельные "потоки". Высокопроизводительные gpus обычно имеют больше вычислительных единиц, чем их процессоры cpu. Например, 6970 gpu (Cayman) имеет 24 вычислительных модуля opencl, каждый из которых разделен на 16 SIMD-блоков. Большинство настольных компьютеров имеют 8 ядер, а серверный процессор в настоящее время останавливается на 16 ядрах. (карта процессора cpu 1:1 для вычисления количества единиц измерения). Единицей вычисления в opencl является часть устройства, которая может выполнять работу, отличную от остальной части устройства.

4) Типы резьбы. gpus имеют SIMD-архитектуру со многими графическими инструкциями. cpus имеют большую часть своей области, предназначенную для прогнозирования ветвей и общих вычислений. Процессор может иметь блок SIMD и/или блок с плавающей запятой в каждом ядре, но упомянутый выше чип Cayman имеет 1536 единиц с набором команд gpu, доступным каждому из них. AMD называет их потоковыми процессорами, и в каждом из упомянутых выше блоков SIMD есть 4 устройства (24x16x4 = 1536). Никакой процессор не будет иметь столько модулей с поддержкой sin (x) или dot-product-only, если только производитель не захочет вырезать некоторое кэш-память или аппаратуру предсказания ветвлений. Схема SIMD для gpus, вероятно, самая большая "победа" для больших ситуаций сложения векторов. То, что также выполняет другие специализированные функции, - большой бонус.

5) Пропускная способность памяти. cpus с DDR3: ~ 17 ГБ/с. Высококачественный gpus > 100 ГБ/с, скорости более 200 ГБ/с в последнее время становятся все более распространенными. Если ваш алгоритм не ограничен PCI-e (см. # 1), gpu опередит процессор в необработанном доступе к памяти. Единицы планирования в gpu могут скрывать задержку памяти, выполняя только задачи, которые не ожидают доступа к памяти. AMD называет это волновым фронтом, Nvidia называет это варп. cpus имеют большую и сложную систему кэширования, которая помогает скрыть время доступа к памяти в случае, когда программа повторно использует данные. Для вашей проблемы с добавлением вектора вы, вероятно, будете больше ограничены шиной PCI-e, поскольку векторы обычно используются только один или два раза.

6) Энергоэффективность. Gpu (используется правильно) обычно будет более электрически эффективным, чем процессор. Поскольку cpus доминирует в тактовой частоте, одним из единственных способов действительно снизить потребление энергии является то, что процессор чинит. Это, очевидно, приводит к увеличению времени вычисления. Многие из лучших систем в списке Green 500 сильно ускоряются. см. здесь: green500.org