Если вы использовали c ++, count_if из библиотеки алгоритмов с политикой выполнения par_unseq
может распараллелить и векторизовать счетчик. По крайней мере, на Linux обычно для этого используется Intel TBB.
В c это вряд ли будет так просто. Поскольку c не имеет таких понятий, как шаблоны, вызываемые объекты или лямбда-выражения, единственный способ специализации обобщенной c (предоставленной библиотекой) count()
-функции - это передать указатель функции в качестве обратного вызова (например, qsort()
делает). Если компилятору не удастся девиртуализировать и встроить обратный вызов, вы вообще не сможете векторизовать, оставив вам (возможно, распараллеленный потоком) скалярный код. OTOH, если вы используете, например, g cc vector intrinsics (мой любимый!), Вы получите векторизацию, но не распараллеливание. Вы можете попытаться комбинировать подходы, но я бы сказал, что переборщите себя и используйте c ++.
Однако, если вам нужна только векторизация, вы почти наверняка можете просто написать последовательный код и выполнить автоматическую векторизацию компилятора, если только предикат того, что следует считать, плохо написан или ваш компилятор поврежден мозгом.
Для пример . g cc векторизует код на x86, если доступны хотя бы инструкции sse4 (-msse4
). С AVX [2/512] (-mavx / -mavx2 / -mavx512f
) вы можете получить более широкие векторы для одновременного выполнения большего количества элементов. В общем, если вы компилируете на том же оборудовании, на котором будете запускать программу, я бы рекомендовал позволить g cc автоматически определять оптимальные расширения набора команд (-march=native
).
Обратите внимание, что в предоставленного кода, условия должны не использовать короткое замыкание или (||
), потому что тогда чтение из max
-вектора семантически запрещено, если сравнение с min
-вектором было уже верно для текущего элемента, серьезно затрудняя векторизацию (хотя avx512 может потенциально векторизовать это с некоторой катастрофой c замедлением).
Я почти уверен, что g cc не совсем оптимально в коде, который он генерирует для avx512, так как он может делать k-reg (регистр маски) or
в регистрах маски с kor[b/w/d/q]
, но, возможно, кто-то с большим опытом работы с avx512 (* cougth * Питер Кордес * кашляет *) мог бы на это повлиять.