在过去的几年中,我进行了大量的 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 运算符
- 向量运算(点、交叉、归一化、饱和、反射等)
- 支持自定义数据类型(结构)
- 动态分支会很好(for 循环、if 语句)
所以最近英特尔发布了ISPC这正是我在问这个问题时所寻找的。它是一种可以与普通 C 代码链接的语言,具有隐式执行模型,并支持开始帖子中提到的所有功能(混合运算符、分支、数据结构、向量操作、着色器等)并针对 SSE2、SSE4 进行编译, AVX、AVX2 和 Xeon Phi 矢量指令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)