LINUX.ORG.RU

OpenCL и комплексные числа

 


0

1

Шалом, православные! Имею спросить за поддержку комплексных вычислений в OpenCL. Из коробки их вроде бы нет, но, говорят, соответствующих хедеров написано уже немало.

Сможет ли кто отсыпать самый что ни на есть подходящий?


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

поправьте, если не так.

то есть лучше использовать float/double и не париться.

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

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

Абсолютно без разницы, потому что на амдшных GPU ALU не SIMD, а VLIW, а на нвидиевских вооще скалярный. А если бы ещё амдшный OpenCL компилятор умел нормально генерить код, чтобы при умножении со знаком "-" для одного из операндов не генерился бред, в котором для этого операнда отдельно применяется операция "-" с копированием во временный регистр, а сразу производилось умножение с использованием аттрибута SRC_NEG, то упаковка ALU была бы максимально возможной.

fang
()

Сложение, вычитание, умножение на вещественное число - есть фактически из коробки, если использовать векторы - float2, double2 (или с бОльшим количеством компонентов, если упаковывать по несколько комплексных чисел в одну переменную). Осталось дописать нужные операции вроде умножения - но тут уж ИМХО проще реализовать нужные операции самому, чем искать. Как правило, несколько операций над комплексными числами можно упростить и соптимизировать математически - так что это очень проектно-специфичная вещь.

tim239 ★★
()
Ответ на: комментарий от tim239

По итогам я тупо вбил код руками. Те хедеры, на которые я натыкался, были или кривыми, или слишком хитровыдуманными.

Yak
() автор топика
Ответ на: комментарий от unanimous

всю жизнь произносил комплЕксные, и всегда меня учили, что именно так правильно. меня обманывали всю мою жизнь? ААА!!

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

Ужас. За такое надо гвозди в голову вколачивать. Плохо с точки зрения и дизайна и производительности.

Насчёт первого всё понятно: комплексное число - единый математический объект, и работать с ним следует как с единым объектом.

Насчёт производительности: доступ к глобальной памяти на GPU - крайне дорогая операция и она выполняется наиболее эффективно для структур, выровненных на размер четырёх float'ов. Т.е. в вашем случае придётся делать аж два крайне неэффективных чтения из памяти.

dmfd
()
Ответ на: комментарий от dmfd

P.S. Не совсем точно выразился. Имелось в виду, что на GPU (по крайней мере на nvidia) за одну инструкцию можно прочитать 4, 8 или 16 байт. При этом время чтения будет одинаково. Т.е., грубо говоря, читать из двух мест по 1 float'у в два раза медленнее, чем из одного - float2.

dmfd
()
Ответ на: комментарий от dmfd

Чукча в курсе, потому чукча просто и без затей копирует всё потребое в локальную память.

Yak
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.