2010-10-26 142 views
7

我現在在Visual Studio 2008中,並在項目設置我看到的選項時「激活擴展指令集」,我可以設置爲無,SSE SSE2或C++如何編寫代碼編譯器可以輕鬆優化SIMD?

因此,編譯器將嘗試批量指令一起爲了使用SIMD指令?

在如何優化代碼中可以遵循任何規則,以便編譯器可以使用這些擴展來編譯高效的彙編程序?

例如,目前我正在研究光線跟蹤器。着色器需要一些輸入和來自所述輸入來計算輸出顏色,這樣的:

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y); 
Color col = shadePixel(data); 

將它例如是有益的寫shadercode使得它將一個指令呼叫內遮陽4個不同像素?像這樣:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y); 
... 
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out); 

一次處理多個數據單元。這對編譯器使用SSE指令會有好處嗎?

謝謝!

回答

5

我現在在Visual Studio 2008中,並在項目設置我看到「激活擴展指令集」,我可以設置爲無選擇工作, SSE或SSE2

因此,編譯器會嘗試將指令批處理以便使用SIMD指令?

不,編譯器本身不會使用向量指令。它將使用標量SSE指令而不是x87指令。

你描述的是所謂的「自動矢量化」。微軟編譯器不這樣做,Intel compilers做。

在Microsoft編譯器上,您可以使用intrinsics來執行手動SSE優化。

+0

所以爲了使用矢量指令,有必要編寫程序集? – Mat 2010-10-26 20:13:28

+0

我認爲Suma意味着其中之一:http://software.intel.com/en-us/articles/intel-compilers/ – mkb 2010-10-26 20:29:25

+0

@Mat - 您可以使用編譯器內在函數編寫SIMD代碼。請參閱http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.71%29.aspx – celion 2010-10-26 22:43:26

0

編譯器並不都是強大的,它有一些限制。如果可以(並且如果正確的標誌被傳遞給它),它將使用SSE指令。查看它所做的唯一方法是檢查編譯器生成的彙編代碼。

另一種選擇是使用C SSE/SSE2指令。對於windows,你可以在這裏找到它們:

http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.80%29.aspx

3

三個意見。

  1. 最好的加速不是從優化但從好的算法到來。因此,請確保您首先獲得該部分。通常這意味着只需爲您的特定域使用正確的庫。

  2. 一旦你得到你的算法正確的時間到措施。工作中通常有80/20規則。 20%的代碼將佔用80%的執行時間。但爲了找到那個部分,你需要一個好的分析器。Intel VTune可以給你從每個功能的抽樣配置文件和精確的報告,查明性能殺手。如果您有AMD CPU,另一個免費選擇是AMD CodeAnalyst

  3. 編譯器的自動矢量化能力不是銀色的子彈。雖然它會很努力(尤其是Intel C++),但您經常需要通過以向量形式重寫算法來幫助它。通過手工製作小部分瓶頸代碼來使用SIMD指令,您通常可以獲得更好的結果。您可以使用內部函數或使用內聯彙編在C代碼中執行此操作(請參閱上面的VJo鏈接)。

當然,第2部分和第3部分形成了一個迭代過程。如果您真的認真對待這個問題,那麼英特爾的這些人士就會有一些很好的書籍,如The Software Optimization Cookbook和處理器參考手冊。