SIMD编程语言

Jas*_*ers 11 programming-languages sse simd ispc

在过去的几年里,我一直在做很多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);
}
Run Code Online (Sandbox Code Playgroud)

在这种语言中真正必须的东西是:

  • 内置混合运营商
  • 矢量运算(点,交叉,标准化,饱和,反射等)
  • 支持自定义数据类型(结构)
  • 动态分支会很好(对于循环,if语句)

Lou*_*arg 7

你最好的选择可能是OpenCL.我知道它主要被大肆宣传为在GPU上运行代码的一种方式,但OpenCL内核也可以在CPU上编译和运行.OpenCL基本上是C,有一些限制:

  1. 没有函数指针
  2. 没有递归

和一堆补充.特别是矢量类型:

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
Run Code Online (Sandbox Code Playgroud)

需要注意的是,代码必须干净利落,OpenCL不能调用任意库等等.但是如果你的计算内核相当独立,那么你基本上得到一个向量增强的C,你不需要使用内在函数.

是一个包含所有扩展的快速参考/备忘单.


vir*_*tor 6

它不是真正的语言本身,但Mono(Mono.Simd)有一个库,它会向你展示向量,并尽可能优化它们对SSE的操作:


Jas*_*ers 5

所以最近英特尔发布了ISPC,这正是我在问这个问题时所寻求的.它是一种可以与普通C代码链接的语言,具有隐式执行模型,并支持开始帖子中提到的所有功能(混合运算符,分支,数据结构,矢量运算,着色器等)以及SSE2,SSE4的编译, AVX,AVX2和Xeon Phi矢量指令.