2015-07-22 8 views
0

Когда мы вызываем функцию для каждого элемента в векторе, используя for_each, это векторы векторов или нет?Векторизовать вызовы функций для каждого элемента вектора

+0

Что такое векторный вызов? Вы спрашиваете, использует ли 'for_each' несколько потоков? – Cameron

+0

Вы имеете в виду инструкции SIMD? – doron

+0

Например, я увеличиваю элементы на 5 в функции – Shubham

ответ

2

В общем, нет.

std::for_each - это просто обертка вокруг петли.

Однако, с оптимизацией, вполне вероятно, что вызов std::for_each встроен и для простых функций, вероятно, что вызов функции для каждого элемента также встроен.

Как только все встраивается, это как если бы петля была написана вручную; в таком случае вопрос становится «будет ли компилятор векторизовать цикл, выполняющий простую арифметику»; и это полностью зависит от компилятора.

Для того чтобы это произошло, компилятор должен знать, что целевая архитектура поддерживает инструкции SIMD и может или не может векторизовать в зависимости от уровня оптимизации, независимо от того, является ли число итераций постоянным или нет, независимо от того, итерации, как известно, кратно 4 и т. д.

+0

Для дальнейшего обобщения: если вызов функции не встроен, все же можно векторизовать такие циклы, используя #pragma omp declare simd в объявлении функции, которая также известна как технология с поддержкой SIMD. К сожалению, этот метод работает только в некоторых версиях компилятора Intel или в компиляторах, поддерживающих стандарт OpenMP4.0. – zam

-2

Предполагая, что вы спрашиваете о std :: vector, ответ - нет. std :: vector - это оболочка вокруг массива, но он косвенно обращается к этим блокам памяти. Однако вы можете взять указатель строки так myVec.begin()._Ptr и работать с ним внутри цикла. метод объявления с noalias помогает, например __declspec(noalias). На вторую часть вопроса отвечает Камерон. Если функция встраивается, а архитектура поддерживает векторизованные данные, компилятор должен теперь векторизовать данные.

+0

Все это полностью зависит от платформы. И небрежно. Вы можете просто сделать '& myVec [0]', что гарантированно сработает. –

Смежные вопросы