在过去的几年里,我做了很多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);
}在这种语言中,真正必须要做的事情是:
发布于 2012-03-28 21:08:44
所以最近英特尔发布了ISPC,这正是我在问这个问题时想要的。它是一种可以与普通C代码链接的语言,具有和隐式执行模型,并支持start post中提到的所有特性(swizzle操作符、分支、数据结构、向量操作、着色器样),并为SSE2、SSE4、AVX、AVX2和Xeon矢量指令编译。
发布于 2009-09-21 14:11:07
你最好的选择可能是OpenCL。我知道它被炒作是在GPU上运行代码的一种方式,但是OpenCL内核也可以编译并在CPU上运行。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,在这里您不需要使用内部代码。
这里是一个包含所有扩展的快速引用/备忘表。
发布于 2009-09-13 13:44:56
它实际上不是语言本身,但是有一个Mono (Mono.Simd)库,它将向您公开向量并尽可能地将它们上的操作优化到SSE中:
https://stackoverflow.com/questions/1417681
复制相似问题