在過去的幾年中,我一直在做大量的SIMD編程,大部分時間我都依賴於編譯器內部函數(比如用於SSE編程的函數)或者編程程序集去真正漂亮的東西。然而,直到現在,我幾乎無法找到任何內置支持SIMD的編程語言。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);
}
的東西,會在該語言中真正的必須是:
- 內置調酒運營商
- 向量運算(點,橫,規範化,飽和,反映等等)
- 支持自定義數據類型(結構)
- 動態分支會很好(對於循環,如果語句)
那些Fortran實現仍以大多數C++編譯器支持的方式使用自動向量化。我遇到的問題是,很難預測哪些代碼將被矢量化,哪些代碼不會。現在我不知道Fortran編譯器中的這種狀態,因爲我的背景是C++版本,所以我認爲我更喜歡高級着色器方法,這讓我可以更好地控制最終輸出。 – 2009-09-13 13:41:53