Я пытаюсь использовать встроенные функции Intel SIMD для ускорения программы запроса-ответа. Предположим, что query_cnt
зависит от ввода, но всегда меньше, чем число регистров SIMD (т. Е. Для их хранения достаточно регистров SIMD). Поскольку запросы - это горячие данные в моем приложении, вместо того, чтобы загружать их каждый раз, когда это необходимо, я могу сначала загрузить их и всегда держать их в регистре?Как сохранить зависящие от входа горячие данные в регистрах при использовании SIMD-функций
Предположим, что запрошены float
и AVX256
поддерживается. Теперь я должен использовать что-то вроде:
std::vector<__m256> vec_queries(query_cnt/8);
for (int i = 0; i < query_cnt/8; ++i) {
vec_queries[i] = _mm256_loadu_ps((float const *)(curr_query_ptr));
curr_query_ptr += 8;
}
Я знаю, что это не очень хорошая практика, так как есть потенциал накладных расходов загрузки/хранения, но, по крайней мере, есть небольшая вероятность, что vec_queries[i]
могут быть оптимизированы таким образом, чтобы они могли быть хранится в регистрах, но я все еще думаю, что это не очень хорошо.
Любые лучшие идеи?
Вы обрабатываете несколько запросов в цикле, который ничего не делает? Если нет, ваши данные не будут оставаться в регистрах, когда вы перейдете к следующему запросу. Или вы говорите, что думаете, что может стоить использовать глобальные переменные регистра для запросов? GNU C может это сделать: '__m256 vec_query0 asm (" ymm0 ");' должен быть правильным синтаксисом IIRC. –
Вы посмотрели фактическое asm, чтобы убедиться, что ваши векторы * не * хранятся в регистрах? Если вам повезет, компилятор может оптимизировать большую часть служебных расходов динамического распределения std :: vector.Если нет, попробуйте использовать массив фиксированного размера (поскольку у вас низкая верхняя граница по его размеру). –
@PeterCordes Спасибо за ваш совет. Я не рассматривал фактический asm, но ваше предположение, что использование массива фиксированного размера может быть хорошим вариантом, так что я могу использовать что-то вроде '__m256 vec_query0 asm (" ymm0 ")' для привязки каждого элемента массива к регистру , но если я это сделаю, будут ли некоторые регистры заняты фиксированными элементами, которые могут привести к штрафу за производительность? – MarZzz