2012-02-05 29 views
2

有沒有簡單的方法可以讓我知道一些代碼是在GPU而不是CPU中執行的?如何知道使用GPU或CPU執行代碼?

+0

嗯,它不是很確定,但對於Windows [「Process Explorer」](http://technet.microsoft.com/zh-cn/sysinternals/bb896653)有一個GPU使用情況圖。所以要麼使用它,要麼找出它使用的API。 – PeterT 2012-02-05 14:59:29

+3

您可以更具體地瞭解您嘗試在GPU上運行的「代碼」類型嗎?您列出3種不同的API,所有這些API都在GPU上運行「代碼」,使用3種完全不同的方式來執行此操作。 – 2012-02-05 15:42:04

回答

8

我認爲你需要弄清楚CPU和GPU之間工作分離的概念。如果您編寫代碼並使用不針對GPU執行的常規編譯器進行編譯,代碼將始終執行CPU。

在主程序中所有對OpenGL或DirectX函數的調用都是在CPU上執行的,沒有「神奇」的翻譯層。然而,一些這些調用使GPU執行某些操作,如繪製三角形。

CUDA和OpenCL是針對數據並行執行體系結構的語言。 GPU就是這樣的架構。但是CUDA和OpenCL代碼需要一些主機程序,而這些程序又將在CPU上執行。可編程着色器(HLSL,GLSL)也是如此。

所以:程序的主機部分(設置工作環境,發出渲染調用或GPU執行)將在CPU上運行。在GPU上運行的代碼是在單獨的編譯單元(即上傳到OpenGL的GLSL着色器代碼,用OpenCL/CUDA編譯器編譯的OpenCL/CUDA代碼)中編譯的。

+0

glsl(.sh)中的所有代碼都在GPU中運行?如果我必須做更復雜的事情,比如高斯/中值濾波,該怎麼辦?如果我寫:float a = 0.5 * 0.7;這次被執行多少次?每像素一個?我怎樣才能控制並行和somehing我只是想運行單向?對不起,我是並行執行編程的新手。 – flankechen 2013-09-17 02:58:02

1

正如datenwolf所說,你編寫的任何通過標準編譯器(gcc等)編譯的代碼都將在CPU上運行。在GPU上運行的程序稱爲着色器。着色器中的變量類型與C/C++程序不同,語法也更加嚴格和更加有限。

舊的圖形應用程序使用兩種類型的着色器:頂點和片段。頂點着色器在發送給渲染器的任何幾何頂點上運行。片段着色器將接收來自頂點着色器的輸出(在幾何面上插值),並且將對將被繪製到屏幕的幾何圖形的每個像素或片段進行操作。

現代圖形已經引入了General Purpose GPU Programming的想法。 OpenGL的幾何着色器和Nvidia的CUDA可以在GPU上執行通用編程。

總結:編譯的着色器在GPU上運行,編譯的C/C++在CPU上運行。

+0

預着色器時代如何?在GPU上運行什麼代碼? – 2015-03-17 09:39:20

+0

預着色器時代也是預先編程的GPU時代,因此GPU上的用戶編寫的代碼無法在其上運行。 – kevintodisco 2015-03-17 16:11:59

1

取決於您使用的操作系統以及OpenGL/OpenCL/other,您可以使用系統分析器爲您提供此信息。系統分析器是跟蹤系統範圍活動的軟件,在完成跟蹤後以可讀形式呈現。 例如,對於Windows,可以使用Vtune,它同時監視CPU和GPU。

希望這會有所幫助。