2011-11-10 67 views
6

你是否推薦閱讀你的內核的PTX代碼,以便進一步優化你的內核?我應該看看PTX來優化我的內核嗎?如果是這樣,怎麼樣?

舉一個例子:我讀過,可以從PTX代碼中找到自動循環展開的原理。如果情況並非如此,則必須在內核代碼中手動展開循環。

  • PTX代碼還有其他用例嗎?
  • 你看看你的PTX代碼嗎?
  • 從哪裏可以找到如何讀取CUDA爲我的內核生成的PTX代碼?
+2

您可以反彙編二進制代碼。海事組織你應該看看,以避免陷入「我認爲它會優化這種類型的陷阱,並能夠看到你實際上在做什麼,當你優化內核。 – harold

回答

13

的第一點,使約PTX的是,它僅是一個中間在GPU上運行的代碼的表示 - 虛擬機彙編語言。 PTX通過編譯時由ptxas組裝到目標機器代碼上,或者在運行時由驅動程序組裝。所以當你在看PTX時,你正在看編譯器發出的是什麼,而不是GPU實際運行的內容。也可以從頭開始編寫自己的PTX代碼(這是CUDA支持的唯一JIT編譯模型),或者作爲CUDA C代碼中的內聯彙編程序部分的一部分(後者自CUDA 4.0以來正式支持,但「非官方「支持的時間要比這長得多)。 CUDA一直附帶該工具包的PTX語言完整指南,並且完整記錄。 ocelot project已經使用這個文檔來實現他們自己的PTX交叉編譯器,它允許CUDA代碼在其他硬件上初始運行,最初是x86處理器,但最近是AMD GPU

如果你想看看GPU實際運行的是什麼(而不是編譯器發出的),NVIDIA現在提供了一個名爲cudaobjdump的二進制反彙編工具,它可以顯示爲Fermi GPU編譯的代碼中的實際機器代碼段。有一款名爲decuda的非官方工具,適用於G80和G90 GPU。

話雖如此,從PTX輸出中學到了很多東西,特別是編譯器如何應用優化以及它發佈什麼指令來實現某些C構造。 NVIDIA CUDA工具包的每個版本都附帶a guide to nvccdocumentation for the PTX language。這兩份文件中都包含大量信息,以便學習如何將CUDA C/C++內核代碼編譯爲PTX,並瞭解PTX指令的功能。

相關問題