2009-09-13 145 views
12

在過去的幾年中,我一直在做大量的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); 
} 

的東西,會在該語言中真正的必須是:

  • 內置調酒運營商
  • 向量運算(點,橫,規範化,飽和,反映等等)
  • 支持自定義數據類型(結構)
  • 動態分支會很好(對於循環,如果語句)

回答

6

最近英特爾發佈了ISPC,這正是我在問這個問題時所尋找的。它是一種可以與普通C代碼鏈接的語言,具有和隱含的執行模型,並且支持開始文章中提到的所有功能(調整操作符,分支,數據結構,向量操作,着色器等)並編譯SSE2,SSE4, AVX,AVX2和Xeon Phi矢量指令。

0

這將是您正在尋找的Fortran。如果內存服務於即使開放源代碼編譯器(g95,gfortran),如果它在您的硬件上實現,也將利用SSE。

+2

那些Fortran實現仍以大多數C++編譯器支持的方式使用自動向量化。我遇到的問題是,很難預測哪些代碼將被矢量化,哪些代碼不會。現在我不知道Fortran編譯器中的這種狀態,因爲我的背景是C++版本,所以我認爲我更喜歡高級着色器方法,這讓我可以更好地控制最終輸出。 – 2009-09-13 13:41:53

6

它不是一個真正的語言本身,但對於單聲道庫(Mono.Simd),將暴露的載體,以你和優化他們的業務併入SSE儘可能:

+0

該解決方案看起來不錯;看起來比C++內在函數好得多。然而,解決方案大致相當,而不是我正在尋找的。 (我一直在尋找使用SIMD內置而非螺栓固定的實際語言)。但是,在做基於.Net的解決方案時,這絕對是要記住的。 – 2009-09-13 20:49:40

0

目前最好的解決辦法是做它自己通過爲Nvidia發佈的開源Cg前端創建後端,但我想省下自己的努力,所以我很好奇,如果它以前完成。最好我馬上開始使用它。

+0

Cg不是開源的,它是Nvidia專有的。創建一個爲CPU生成SIMD代碼的後端將是一項巨大的工作。 正如路易斯回答的,你應該認真查看OpenCL。您可以使用基於C的語言編寫處理內核(與Cg和GLSL非常相似),然後在GPU或CPU上運行它(它將爲您生成SIMD代碼)。 OpenCL是跨平臺的,由許多供應商(Nvidia,ATI,Apple等)支持,您可以立即獲得SDK。 – gavinb 2009-09-22 12:03:24

+0

可從http://developer.nvidia.com/object/cg_compiler_code.html獲取Cg前端源代碼。該代碼專門用於爲編譯器創建後端。不過,我更喜歡現有的解決方案,如OpenCL。 – 2009-09-22 14:21:48

7

你最好的選擇可能是OpenCL。我知道它大多被炒作爲在GPU上運行代碼的一種方式,但OpenCL內核也可以在CPU上編譯和運行。 OpenCL是基本上下,用一些限制:

  1. 沒有函數指針
  2. 沒有遞歸

和一堆增加的。在特定的載體類型:

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 

在大需要注意的是,該代碼必須是乾淨sperable,OpenCL的不能調出任意庫,等等。但是,如果你的計算內核是相當獨立的,那麼你基本上得到一個矢量增強C,你不需要使用內部函數。

Here是一個快速參考/備忘錄與所有的擴展。

+0

我仍然可以將OpenCL庫鏈接到一個C應用程序並將其傳遞給一組向量? – 2009-09-21 14:26:08

+0

想一想,它不需要能夠鏈接,我只需要能夠傳遞一些數據:-) – 2009-09-21 14:29:15

+1

基本上,你編譯一個OpenCL計算內核,它有一個C函數作爲入口點,那麼你運行告訴OpenCL使用你指定的參數來運行內核,這些參數可能是向量,數據集,甚至紋理。 – 2009-09-21 20:59:00

1

它是一個C++庫,而不是內置於該語言中,但是一旦聲明瞭變量,Eigen就很隱蔽。

0

D編程語言還提供了以類似於Mono.SIMD的方式訪問SIMD的功能。