Переписывание следующей функции с использованием std :: find_if дает примерно 2x ускорение, но только при предоставлении ЦП Intel. < /p>
bool process_update_range_based(int treeId, int newHeight, bool tall,
std::vector& vec, std::vector& updateSet) {
for (auto &hr : vec) {
if (hr.treeId == treeId) {
if (hr.height == newHeight)
return false;
else {
hr.height = newHeight;
updateSet.push_back(treeId);
return true;
}
}
}
vec.emplace_back(treeId, newHeight, tall);
return true;
}
< /code>
Были проведены следующие измерения: моделируйте 10 раз, измеряйте среднее и минимальное время для выполнения n итераций. Минимальное значение является наиболее надежным, особенно в браузере, когда нет данных о внешних часах ЦП (значения Godbolt сильно различаются). Флаги компилятора были -o3 -march = x86-64-V3 < /p>
cpu < /th>
для цикла Avg < /th>
find_if avg < /th>
для цикла мин < /th>
find_if min < /th>
< /tr>
< /thead>
Godbolt venuineIntel
n/a
n/a
0.0275
0.0136
< /tr>
odbolt autenticamd < /td>
n/a
n/a
0.0245
0.0212
< /tr>
Apple M2 < /td>
0.0258
0.0235
0.0216
0.0216
< /tr>
amd 5600h < /td>
0.0288
0.0287
0.02444
0.0217
< /tr>
Intel I5-1335U < / td>
0.0294
>0.0152
0.0223
0.0125
исходный код Godbolt & Clarkmark < /p>
Как видите, на CPUS std :: find_if почти в 2 раза по сравнению с базовыми петля. Тем временем процессоры AMD/Apple либо 10-20%, либо совершенно одинаковы. Такое поведение последовательно между несколькими компиляторами (G ++, Clang ++, MSVC) < /p>
Особенно сбивает с толку, поскольку ускорение происходит только при замене цикла на основе диапазона на библиотечную функцию. .asm Code выглядит как некоторые простые движения и сравнения. Godbolt с функциями только сборка (без эталона) < /p>
Что вызывает эту разницу? Что такого особенного в процессорах Intel? Почему они выполняют ту же сборку в 2 раза быстрее, чем процессор AMD/Apple?
Подробнее здесь: https://stackoverflow.com/questions/794 ... intel-cpus
Почему std :: find_if значительно ускоряет функцию только на процессорах Intel? ⇐ C++
Программы на C++. Форум разработчиков
1740456338
Anonymous
Переписывание следующей функции с использованием std :: find_if дает примерно 2x ускорение, но только при предоставлении ЦП Intel. < /p>
bool process_update_range_based(int treeId, int newHeight, bool tall,
std::vector& vec, std::vector& updateSet) {
for (auto &hr : vec) {
if (hr.treeId == treeId) {
if (hr.height == newHeight)
return false;
else {
hr.height = newHeight;
updateSet.push_back(treeId);
return true;
}
}
}
vec.emplace_back(treeId, newHeight, tall);
return true;
}
< /code>
Были проведены следующие измерения: моделируйте 10 раз, измеряйте среднее и минимальное время для выполнения n итераций. Минимальное значение является наиболее надежным, особенно в браузере, когда нет данных о внешних часах ЦП (значения Godbolt сильно различаются). Флаги компилятора были -o3 -march = x86-64-V3 < /p>
cpu < /th>
для цикла Avg < /th>
find_if avg < /th>
для цикла мин < /th>
find_if min < /th>
< /tr>
< /thead>
Godbolt venuineIntel
n/a
n/a
0.0275
0.0136
< /tr>
odbolt autenticamd < /td>
n/a
n/a
0.0245
0.0212
< /tr>
Apple M2 < /td>
0.0258
0.0235
0.0216
0.0216
< /tr>
amd 5600h < /td>
0.0288
0.0287
0.02444
0.0217
< /tr>
Intel I5-1335U < / td>
0.0294
>0.0152
0.0223
0.0125
исходный код Godbolt & Clarkmark < /p>
Как видите, на CPUS std :: find_if почти в 2 раза по сравнению с базовыми петля. Тем временем процессоры AMD/Apple либо 10-20%, либо совершенно одинаковы. Такое поведение последовательно между несколькими компиляторами (G ++, Clang ++, MSVC) < /p>
Особенно сбивает с толку, поскольку ускорение происходит только при замене цикла на основе диапазона на библиотечную функцию. .asm Code выглядит как некоторые простые движения и сравнения. Godbolt с функциями только сборка (без эталона) < /p>
Что вызывает эту разницу? Что такого особенного в процессорах Intel? Почему они выполняют ту же сборку в 2 раза быстрее, чем процессор AMD/Apple?
Подробнее здесь: [url]https://stackoverflow.com/questions/79465266/why-stdfind-if-significantly-accelerates-function-only-on-intel-cpus[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия