world.system<Weight>("ClearWeight")
.kind<stocks::phases::Update>()
.iter([](flecs::iter it, Weight* weight) {
const std::size_t loop_size = it.count();
//не хочет это векторизовать
for (std::size_t i = 0; i < loop_size; ++i) {
weight[i].weight = 0.0;
}
});
Структура Weight
struct Weight {
double weight = 0;
double max_weight = std::numeric_limits<float>::infinity();
};
При включенном
add_compile_options(/arch:AVX2 /Qvec-report:2)
Пишет код ошибки 1200, что значит:
Цикл содержит зависимости данных, переносимые циклом, которые препятствуют векторизации. Различные итерации цикла препятствуют друг другу, таким образом, что векторизация цикла создаст неправильные ответы, и автовектор не может доказать себе, что такие зависимости данных отсутствуют.
Возможно не может из-за отсутствия хинта на выравнивание? Из-за того что в памяти оно представлено как [weight, max_weight, weight, ...] (т.е. ему мешает max_weight)?
А что если сохранить weight в локальную переменную?
Типа такого? world.system<Weight>("ClearWeight") .kind<stocks::phases::Update>() .iter([](flecs::iter it, Weight* weight) { const std::size_t loop_size = it.count(); //for(auto i : it) { double w = 0.0; for (std::size_t i = 0; i < loop_size; ++i) { weight[i].weight = w; } }); Без изменений
Нет, auto w = weight; и использовать внутри цикла вместо weight
Пессимизирующий компилятор как обычно
Пора уже переходить на SOA :)
Обсуждают сегодня