2012-02-11 3 views
0

Я знаю, что для Intel векторные регистры оптимизированы, например. микроархитектура SandyBridge (SSE + AVX), но как насчет графического процессора NVIDIA?OpenCL: векторные регистры NVIDIA (float4, float8, ..) VS векторные регистры Intel

Некоторые источники, которые я где-то читал (я забыл, где) заявил, что использование векторных регистров бесполезно для графического процессора NVIDIA. Однако у меня был тестовый запуск программы с векторными регистрами на графическом процессоре и по сравнению с ними , они дали мне пример. 1.7x ускорение.

FYI CPU Intel дает только 1,25x ускорение для той же программы.

Так что если NVIDIA действительно оптимизирует эти векторные регистры, может кто-то, пожалуйста, дать мне объяснение или источник для чтения? Мне нужно это для документации. Благодарю.

+2

Вероятным источником улучшения производительности на графическом процессоре NVIDIA будет пропускная способность памяти. Аппаратное обеспечение может хранить магазины и нагрузки для 64 и 128-битных типов в одной транзакции на каждом мультипроцессоре, что уменьшает общую задержку и увеличивает эффективную пропускную способность. – talonmies

+0

Спасибо за ответ. Вы имеете в виду 16 единиц загрузки/хранения? Может ли каждая единица загружать/хранить 128-битные типы для каждой деформации? (следовательно, делает его 16x128). Если нет, я думаю, что это не так. Потому что использование неявного векторного регистра (convert_floatn, vloadn и т. Д.) Действительно имеет значение. Это дает лучшее ускорение. – ardiyu07

+0

Да. Аппаратное обеспечение может обрабатывать размеры транзакций размером 256 и 512 байтов для каждой основы. Это может привести к увеличению использования полосы пропускания на любом заданном уровне занятости. Посмотрите на слайд 35 из этих слайдов (http://www.cs.berkeley.edu/~volkov/volkov10-GTC.pdf) (примечание pdf) для примера ядра memcpy в CUDA, который иллюстрирует эффект. – talonmies

ответ

2

Вероятным источником улучшения производительности на графическом процессоре NVIDIA будет пропускная способность памяти. Аппаратное обеспечение может хранить магазины и нагрузки для 64 и 128-битных типов в одной транзакции на каждом мультипроцессоре, что уменьшает общую задержку и увеличивает эффективную пропускную способность. Аппаратное обеспечение может обрабатывать размеры транзакций размером 256 и 512 байтов для каждого варпа, поэтому подходящий согласованный запрос на загрузку/хранение float4 для варпа может обслуживаться в одной транзакции, а запрос загрузки/хранения - в двух транзакциях. Это может привести к увеличению использования пропускной способности глобальной памяти на любом заданном уровне занятости. См. Около слайда 35 из this presentation Василия Волкова из UC Berkeley для примера ядра memcpy в CUDA, который иллюстрирует влияние размера типа (и результирующих размеров транзакций) на пропускную способность памяти.

+0

Предполагаете ли вы, что графический процессор на самом деле не использует инструкции SIMD для float4/... для вычислений? – eudoxos

+2

@eudoxos: ALU на оборудовании NVIDIA DX10/DX11 (те, которые могут запускать CUDA и OpenCL) не имеют арифметических инструкций SIMD для работы с векторными типами, такими как 'float4'. Это чисто скалярные устройства. Единственными операциями, которые могут выполняться непосредственно над векторными типами, являются загрузка/хранение и фильтрация через аппаратное обеспечение текстуры. – talonmies

Смежные вопросы