Существуют ли языки программирования или языковые расширения, которые основаны на неявной векторизации?
Мне понадобится что-то, что сделает агрессивные предположения для создания хорошего DLP/векторизованного кода для SSE4.1, AVX, AVX2 (с или без FMA3/4) с единственной/двойной точностью из скалярного кода C.
В течение последних 10 лет мне было весело, полагаясь на встроенные функции Intel, чтобы написать мои ядра HPC, явно векторизованные. В то же время меня постоянно разочаровывает качество DLP-кода, сгенерированного компиляторами C/С++ (GCC, clang, LLVM и т.д., Если вы спросите, я могу опубликовать конкретные примеры).
Из Руководство по использованию, ясно, что запись "вручную" ядер HPC с встроенными функциями для современных платформ уже не является устойчивым вариантом, если у меня нет армии программистов. Слишком много версий и комбинаций: SSE4.1, AVX, AVX2, AVX512 + вкусы, FMA, SP, DP, половина точности? Это просто неустойчиво, если мои целевые платформы, скажем, самые распространенные из них с 2012 года.
Недавно я попробовал компилятор Intel Offline для OpenCL (CPU). Я написал ядро "a la CUDA" (то есть скалярный код, неявная векторизация), и, к моему удивлению, сгенерированная сборка была очень хорошо векторизована! (Skylake, AVX2 + FMA в SP) Единственное ограничение, с которым я столкнулся, заключалось в отсутствии встроенных функций для сокращения данных/interworkitem-связи, не полагаясь на разделяемую память (что бы перевести на горизонтальные добавления процессора или перетасовать + мин/максимальные операции).
Как указано clemens и sschuberth, автономный компилятор на самом деле не является решением, если я не полностью охватываю OpenCL. Или я взломаю свой код вызывающего абонента, чтобы он соответствовал вызывающему соглашению сгенерированной сборки, которая включает в себя параметры, которые мне не нужны, например ndrange. Полностью охватывающий OpenCL для меня тоже не вариант, поскольку для TLP я полагаюсь на OpenMP и Pthreads (и для ILP я полагаюсь на аппаратное обеспечение).
Update
Во-первых, стоит вспомнить, что неявная векторизация и авторазвитие - это не одно и то же. Фактически, я потерял надежду на автовекторность (как упоминалось выше). Не в неявной векторизации.
В одном из приведенных ниже ответов вы найдете примеры кода. Здесь Я предоставляю пример кода ядра, реализующего схему поджига третьего порядка для конвекционного члена NSE на трехмерном структурированном блоке. Стоит упомянуть, что это представляет собой тривиальный пример, так как не требуется взаимодействие/связь между SIM-картами SIMD.