【发布时间】:2010-11-27 21:49:41
【问题描述】:
在过去的几年里,我进行了大量的 SIMD 编程,并且大部分时间我一直依赖编译器内部函数(例如用于 SSE 编程的函数)或编程汇编来实现真正漂亮的东西。然而,到目前为止,我几乎找不到任何内置支持 SIMD 的编程语言。
现在显然有一些着色器语言,例如 HLSL、Cg 和 GLSL,它们对这类东西具有原生支持,但是,我正在寻找至少能够在没有自动矢量化但具有内置支持的情况下编译为 SSE 的东西用于向量运算。这种语言存在吗?
这是一个 Cg 着色器的(部分)示例,它进行聚光灯,就语法而言,这可能是最接近我正在寻找的。p>
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 运算符
- 矢量运算(点、交叉、归一化、饱和、反射等)
- 支持自定义数据类型(结构)
- 动态分支会很好(for 循环、if 语句)
【问题讨论】:
标签: programming-languages sse simd ispc