2011-12-30 7 views
15

Хотя графические процессоры предназначены для использования с типами данных с плавающей запятой, меня бы интересовало, насколько быстро процесс GPU может обрабатывать побитовые операции. Это самые быстрые возможности для CPU, но делает ли GPU эмулировать побитовые операции или они полностью вычисляются на аппаратном уровне? Я планирую использовать их в программах шейдеров, написанных с помощью GLSL. Также я бы предположил, что если побитовые операции имеют полную предысторию, то должны также иметься целые типы данных, но мне нужно подтверждение.Выполнение целочисленных и побитовых операций на GPU

Чтобы быть более точным, целевыми версиями являются OpenGL 3.2 и GLSL 1.5. Аппаратное обеспечение, которое должно запускать это, - это любая видеокарта Radeon HD и GeForce серии 8 и новее. Если в новых версиях OpenGL и GLSL произошли некоторые существенные изменения, связанные со скоростью обработки побитовых операций/целых чисел, я был бы рад, Отметьте их.

+0

Вам нужно указать конкретную архитектуру графического процессора или, по крайней мере, версию OpenGL. Сейчас этот вопрос ужасно расплывчато. –

+0

@BenVoigt обновлен, достаточно ли он достаточно, или вам нужно определенное кодовое имя архитектуры (они меняют их, как для каждой новой карты) – Raven

+0

Ворон: Есть огромные изменения между Radeon HD 1xxx и HD 7xxx, но эта дополнительная информация является большое улучшение. Предполагая, что вы смотрите на карты, которые рекламируют поддержку OpenGL 3.2 (или позже), это, вероятно, достаточно ясно. –

ответ

8

Этот вопрос частично ответил Integer calculations on GPU

В коротких современных графических процессорах имеют эквивалентный INT и FP производительность для данных 32-битных. Таким образом, ваши логические операции будут работать с одинаковой скоростью.

С точки зрения программирования вы потеряете производительность, если имеете дело с целыми данными SCALAR. Графические процессоры, такие как работа с PARALLEL и PACKED.

for(int i=0; i<LEN_VEC4; i++) 
    VEC4[i] = VEC4[i] * VEC4[i]; // (x,y,z,w) * (x,y,z,w) 

Если вы делаете что-то вроде ...

for(int i=0; i<LEN_VEC4; i++) 
    VEC4[i].w = (VEC4[i].x & 0xF0F0F0F0) | (VEC4[i].z^0x0F0F0F0F)^VEC4[i].w; 

... делать множество различных операций над элементами одного и того же вектора вы столкнетесь с проблемами производительности.

+0

Спасибо за ваш ответ. В сочетании со связанной почтой достаточно, но у меня появился еще один вопрос. Как написано, производительность INT и FP должна быть одинаковой. Но нет ничего похожего на побитовые операции для FP (или, по крайней мере, это было бы странно). Итак, что они говорят, чтобы быть равным .. добавление и так далее? И если это так, побитовые операции (например, сдвиг) быстрее, чем математические операции (добавление ..) для типов данных INT, или производительность также равна. – Raven

+0

Является ли «X бит сдвиг влево на 1» быстрее, чем «x + x» является довольно зависимой от архитектуры. Я надеюсь, что некоторые оптимизации будут возникать, когда ваш shadar будет скомпилирован (если вы не написали его в сборке GPU). «X делить на 2» имеет источник медленнее, чем «X бит сдвиг вправо 1» только потому, что в делении больше логики, чем сдвиг бит. –

+3

«Графические процессоры, такие как работа с ПАРАЛЛЕЛЬНЫМИ и УПАКОВАННЫМИ операциями». Самые последние графические процессоры NVidia и AMD - это скалярные архитектуры. Таким образом, производительность для чисто скалярных операций на самом деле выше, чем для векторных операций. – datenwolf

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