Я пытаюсь обернуть голову вокруг доступа к памяти внутренним типам, которые загружены или не загружены в регистры.
Предполагается, что некоторые функции SIMD принимают ссылки на массивы с плавающей точкой. Например,
void do_something(std::array<float, 4>& arr);
void do_something_else(std::array<float, 4>& arr);
Каждая функция сначала загружает данные в регистры, выполняет свою операцию, а затем сохраняет результат обратно в массив. Предполагая следующий фрагмент:
std::array<float, 4> my_arr{0.f, 0.f, 0.f, 0.f};
do_something(my_arr);
do_something_else(my_arr);
do_something(my_arr);
Оптимизирует ли компилятор c ++ ненужные загрузки и сохраняет между вызовами функций? Имеет ли это значение?
Я видел библиотеки, которые обертывают тип __m128
в структуру и вызывают загрузку в конструкторе. Что происходит, когда вы сохраняете их в куче и пытаетесь вызывать их? Например,
struct vec4 {
vec4(std::array<float, 4>&) {
// do load
}
__m128 data;
};
std::vector<vec4> my_vecs;
// do SIMD work
Вам нужно загружать / хранить данные при каждом доступе? Или эти классы должны объявить приватный operator new
, чтобы они не сохранялись в куче?