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 :)
 Александр
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Александр
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Обсуждают сегодня