在过去的几年里,我做了很多 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);
}
在这种语言中真正必须的东西是:
- 内置调酒运算符
- 矢量操作(点、交叉、归一化、饱和、反射等)
- 支持自定义数据类型(结构)
- 动态分支会很好(for循环,if语句)