Языки программирования SIMD
В последние пару лет я много занимался программированием на SIMD, и большую часть времени я полагался на встроенные функции компилятора (например, те, что для программирования SSE) или на ассемблер программирования, чтобы добраться до действительно изящного вещи. Однако до сих пор я едва мог найти какой-либо язык программирования со встроенной поддержкой SIMD.
Теперь очевидно, что есть шейдерные языки, такие как HLSL, Cg и GLSL, которые имеют встроенную поддержку для такого рода вещей, однако я ищу что-то, что могло бы по крайней мере компилироваться в SSE без автовекторизации, но со встроенной поддержкой векторных операций, Существует ли такой язык?
Это пример (часть) Cg-шейдера, который делает акцент, и с точки зрения синтаксиса это, вероятно, наиболее близко к тому, что я ищу.
float4 pixelfunction(
output_vs IN,
uniform sampler2D texture : TEX0,
uniform sampler2D normals : TEX1,
uniform float3 light,
uniform float3 eye ) : COLOR
{
float4 color = tex2D( texture, IN.uv );
float4 normal = tex2D( normals, IN.uv ) * 2 - 1;
float3 T = normalize(IN.T);
float3 B = normalize(IN.B);
float3 N =
normal.b * normalize(IN.normal) +
normal.r * T +
normal.g * B;
float3 V = normalize(eye - IN.pos.xyz);
float3 L = normalize(light - IN.pos);
float3 H = normalize(L + V);
float4 diffuse = color * saturate( dot(N, L) );
float4 specular = color * pow(saturate(dot(N, H)), 15);
float falloff = dot(L, normalize(light));
return pow(falloff, 5) * (diffuse + specular);
}
Вещи, которые были бы действительно необходимыми на этом языке:
- Встроенные операторы Swizzle
- Векторные операции (точка, крест, нормализация, насыщение, отражение и так далее)
- Поддержка пользовательских типов данных (структур)
- Динамическое ветвление было бы хорошо (для циклов, если операторы)
8 ответов
Так что недавно Intel выпустила ISPC, который именно то, что я искал, задавая этот вопрос. Это язык, который может связываться с обычным кодом C, имеет и неявную модель выполнения, а также поддержку всех функций, упомянутых в начальном посте (операторы Swizzle, ветвление, структуры данных, векторные операции, шейдеры) и компилируется для SSE2, SSE4, Векторные инструкции AVX, AVX2 и Xeon Phi.
Ваша лучшая ставка, вероятно, OpenCL. Я знаю, что в основном это было сделано как способ запуска кода на графических процессорах, но ядра OpenCL также можно компилировать и запускать на процессорах. OpenCL - это в основном C с несколькими ограничениями:
- Нет указателей на функции
- Нет рекурсии
и куча дополнений. В частности, векторные типы:
float4 x = float4(1.0f, 2.0f, 3.0f, 4.0f);
float4 y = float4(10.0f, 10.0f, 10.0f, 10.0f);
float4 z = y + x.s3210 // add the vector y with a swizzle of x that reverses the element order
С большой оговоркой следует, что код должен быть чисто работоспособным, OpenCL не может вызывать произвольные библиотеки и т. Д. Но если ваши вычислительные ядра достаточно независимы, то вы в основном получаете расширенный вектор C, в котором вам не нужно использовать встроенные функции.,
Вот краткий справочник / шпаргалка со всеми расширениями.
Это на самом деле не сам язык, но есть библиотека для Mono ( Mono.Simd), которая предоставит вам векторы и оптимизирует операции над ними в SSE, когда это возможно:
Это библиотека для C++, а не встроенная в язык, но Eigen становится довольно невидимым после объявления ваших переменных.
В настоящее время лучшее решение - это сделать это самостоятельно, создав бэк-энд для внешнего интерфейса Cg, который выпустил Nvidia, но я бы хотел сэкономить усилия, поэтому мне любопытно, было ли это сделано раньше. Желательно, чтобы я начал использовать его прямо сейчас.
Язык программирования D также обеспечивает доступ к SIMD аналогично Mono.SIMD.
Я знаю, что этот вопрос немного устарел, но я оказался в аналогичном затруднительном положении и решил, что должен просто сделать свой собственный.
Я еще не очень далеко продвинулся, но если вас интересуют направления, которые я изучаю, возможно, стоит взглянуть. :)
https://github.com/HappMacDonald/MasterBlaster
MasterBlaster — это функциональный язык программирования, но он собирается скомпилироваться в байт-код, который в конечном итоге является его собственным гораздо более простым языком на основе стека под названием Crude. Затем Crude компилируется непосредственно в сборку.
Моя стратегия ориентирована на SIMD: неоптимизированные исполняемые файлы будут почти полностью использовать SIMD, а затем одной из потенциальных оптимизаций будет упрощение кода, который не получает преимуществ от SIMD, за счет использования вместо этого только общих регистров.
Сырье находится на стадии завершения по Тьюрингу, но в настоящее время существует только в виде нескольких десятков макросов GAS. Я работаю над автономным компилятором для него и создаю функции итератора/генератора, которые являются звездами шоу, когда речь идет об ускорении SIMD.
Пока нет поддержки vector-matrix-etc, но это есть в дорожной карте, и я, вероятно, буду иметь в виду ваше описание при написании этого синтаксиса. :)
Это будет Фортран, который вы ищете. Если память обслуживает, даже компиляторы с открытым исходным кодом (g95, gfortran) воспользуются SSE, если она реализована на вашем оборудовании.