Если размер набора данных известен во время компиляции, то компилятор потенциально может выполнить:
Если это математическая операция
- Векторизация может войти в игру
Вы также можете сделать логику наизнанку:
if (epic-setting)
{
//massive for loop
}
Это это плохо длялокальность памяти, как сказал один человек.
Предсказание ветвлений очень поможет вам, если и только если стоимость пропущенной ветки меньше заданного ускорения (для большого набора данных это должно помочь, а непричинить боль).
Если ваша операция с данными полностью параллельна, т. Е. Вы используете SIMD, вы можете исследовать потоки операций: например, открыть 3 потока и заставить всех 3 выполнить операцию i % t
, t
является индексом потока, i
является индексом данных.(Вы можете разделить данные по-разному).Для достаточно большого набора данных, если у вас нет операций синхронизации, вы увидите линейное ускорение.
Если вы пишете это для специализированной системы, например, промышленного компьютера с заданным ЦП, и вы можете предположить, что у вас всегда будет этот ЦП, вы можете оптимизировать гораздо больше для того, что этот ЦП может поддерживать.Такие вещи, как точный размер кэша, глубина конвейера и т. Д., Все могут быть закодированы. Если вы не можете этого предположить, попробуйте сделать подсчет по этим подсчетам.