Войти
ПрограммированиеФорумОбщее

C++, низкий уровень, оптимизация быстродействия. (11 стр)

Страницы: 17 8 9 10 11 12 Следующая »
#150
(Правка: 2:29) 2:17, 18 фев. 2019

Mikle
> Но к частям регистра далеко не всегда есть простой доступ, как к элементам
> юниона. Скажем, в EAX два младших байта ещё доступны, как AL и AH, а вот два
> старших никак, только выделять их с помощью битовых операций и сдвигов.
А какая именно операция требуется? можно делать битовую эмуляцию любой и достаточно быстро без необходимости дробить на байты. Аналогично двоично десятичным вычислениям с коррекцией.
А для загрузки отдельных байт тоже есть плюшки, в современных процессорах не так все медленно как кажется. Но это на крайний случай в SIMD же все есть.

Mikle
> union сможет работать с регистром? Что-то сомневаюсь, как бы это не подвигло
> компилятор всё переносить в память.
В рамках SIMD регистров можно делать каст через указатель и регистр остается регистром если он того же размера и со своими операциями работает. Ну и еще есть прямые операции обмена данных между общими и SIMD регистрами. Будет тогда зависеть от SSE4 или SSE2

SSE4 вроде как объединяется с MMX и расширяет его.

#151
2:39, 18 фев. 2019

https://social.msdn.microsoft.com/Forums/vstudio/en-US/ba5378c7-a… rum=vcgeneral

"The __m64 data type is not supported on x64 processors. Applications that use __m64 as part of MMX intrinsics must be rewritten to use equivalent SSE and SSE2 intrinsics."

(источник).
Ввожу в google "MSVC MMX" и он мне выдаёт автодополнение "msvc mmxii", бгг.
#152
3:08, 18 фев. 2019

Да, для VS чтение по указателю заруливает memcpy:
https://godbolt.org/z/6LaVVk
Забавно, что если для x86 выключить /O2, то код функции становится SSE, а не FPU.
movdqu - тоже забавно.
Ещё видно, что в x64 инструкция simd r,m не требует выравнивания.

#153
(Правка: 16:44) 16:41, 18 фев. 2019

FordPerfect
> Там depends. Обычно говорят, что доступ в L1 кеш имеет 0..4 такта latency.

https://www.7-cpu.com/cpu/Haswell.html
https://www.7-cpu.com/cpu/Broadwell.html
https://www.7-cpu.com/cpu/Skylake_X.html

Можно реф на 0 тактов?

#154
18:01, 18 фев. 2019

Truthfinder
Походу, гоню.
Да, 4 такта довольно стабильно, для кучи процессоров.

Возможно, там где я смотрел речь шла о гомогенизированном "доступе в память", который смешивал throughput и latency.

#155
18:17, 18 фев. 2019

FordPerfect
> Да, 4 такта довольно стабильно, для кучи процессоров.
На практике, для довольно большого класса алгоритмов перенос констант из регистров в L1 на скорость не влияет.
У процессоров отдельный юнит для доступа к памяти, который в сколь-нибудь серьезных алгоритмах часто недозагружен.

#156
(Правка: 18:31) 18:30, 18 фев. 2019

Кстати, на ARM тоже, вроде, 4 такта.
Наткнулся на https://github.com/jdmccalpin/low-overhead-timers и осознал, что rdpmc таки можно использовать в user mode, если OS разрешает!
Круто же.

https://rextester.com/DMNMA51986

#157
(Правка: 18:31) 18:31, 18 фев. 2019

}:+()___ [Smile]
> На практике, для довольно большого класса алгоритмов перенос констант из
> регистров в L1 на скорость не влияет.

Можно ссылочку на пруфы? На тесты или статью? Пока нет ни одного доказательства, что работа с кешем первого уровня эквивалентна по скорости регистровой памяти.

#158
18:44, 18 фев. 2019

Код черновой, очевидно.
По-хорошему там, видимо, следить, чтобы оно на одном ядре выполнялось.

}:+()___ [Smile]
> На практике, для довольно большого класса алгоритмов перенос констант из регистров в L1 на скорость не влияет.
Что не отменяет того, что мысленную модель лучше иметь правильную.

#159
19:35, 18 фев. 2019

Truthfinder
> Можно ссылочку на пруфы? На тесты или статью?
Это я лично гонял тесты и заменял инструкции в ассемблере.

Ибо в x86 режиме регистров очень мало и приходится экономить.

> работа с кешем первого уровня эквивалентна по скорости регистровой памяти
Я такого не говорил, просто на практике дополнительная задержка L1 часто маскируется другими инструкциями.
Понятно, что длинная цепочка зависимых инструкций станет медленней, но константы можно держать в памяти.

> Что не отменяет того, что мысленную модель лучше иметь правильную.
Это да. Просто не стоит так уж боятся памяти, есть достаточно широкий класс случаев, когда доступ фактически бесплатен.

#160
20:10, 18 фев. 2019

Ну вот например вычисляется 100-кратный приблизительный синус (источник):
https://rextester.com/BQDY28643

#161
(Правка: 1:53) 1:34, 20 фев. 2019

> Это да. Просто не стоит так уж боятся памяти, есть достаточно широкий класс
> случаев, когда доступ фактически бесплатен.
Это за счет того получается что константы лежат рядом с кодом, как аналог прямой загрузки константы в регистр из опкода. То есть память с константами кешируется автоматом вместе с кодом, а за счет этого и выигрыш. Ну и когда константы мирно лежат в одном блоке памяти тот же случай. Поскольку кеш сегментирован, то этот участок памяти за счет частого обращения может вообще из кеша не вылазить. Та же песня при использовании стека.

Единственная проблема это переключение между процессами и прочие прерывания на одном ядре, но уже старо. Не даром раньше в досе программы работали местами быстрее.

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

#162
8:27, 20 фев. 2019

foxes
> Это за счет того получается что константы лежат рядом с кодом, как аналог
> прямой загрузки константы в регистр из опкода. То есть память с константами
> кешируется автоматом вместе с кодом, а за счет этого и выигрыш.
А как же:

В современных процессорах обычно L1 разделен на два кэша — кэш команд (инструкций) и кэш данных
#163
(Правка: 11:47) 11:28, 20 фев. 2019

Mikle
> В современных процессорах обычно L1 разделен на два кэша — кэш команд
> (инструкций) и кэш данных
Во первых константы должны лежать в том же сегменте что и код, очевидно что константы из далекого дата сегмента тут не в счет, хотя прокешироваться они могут уже при старте программы.

Не даром есть "const type" что позволяет класть данные не в модифицируемый дата сегмент а рядом с кодом.

Во вторых не надо забывать про остальные уровни кеша. Пул констант в любом случае получается самой востребованной частью памяти. Ну и все таки это только современные процессоры, для которых L1 это абсолютно новый уровень кеша. То есть случаев когда константы из памяти уже в кеше достаточно много, чтобы заморачиваться о каком то конкретном случае.

#164
1:36, 5 мар. 2019

ребят, а что, godbolt.org не умеет openmp использовать, даже для MS?

extern int imax;

#pragma omp parallel for
for(int i = 0; i < imax; ++i){

}

вот на такое ругается.
https://godbolt.org/z/ZpcnPQ

Страницы: 17 8 9 10 11 12 Следующая »
ПрограммированиеФорумОбщее