2012-12-10 52 views
3

我試着用CUDA驅動程序API運行由.cl內核生成的PTX彙編代碼。我採取的步驟是,這些(標準的OpenCL程序):CUDA PTX代碼%envreg <32>特殊寄存器

1)負載.CL內核

2)JIT編譯

3)獲取編譯PTX代碼並保存它。

到目前爲止這麼好。

我注意到了一些特殊的寄存器,在ptx程序集中,%envreg3,%envreg6等等。問題是這些寄存器沒有設置(根據ptx_isa,這些寄存器在內核啓動前由驅動程序設置)與驅動程序API的代碼。所以代碼陷入了無限循環,並且無法正確運行。但是,如果我手動設置值(我確切地說,我用塊內部ptx替換%envreg6),代碼正在執行,並且我得到正確的結果(與cpu結果相比是正確的)。

有誰知道如何我們可以設置值這些寄存器,或者如果我失去了一些東西?即cuLaunchKernel上的一個標誌,它爲這些寄存器設置了值?

回答

3

您正在嘗試編譯OpenCL內核並使用CUDA驅動程序API運行它。 NVIDIA®(英偉達™)驅動程序/編譯器接口在OpenCL和CUDA之間有所不同,因此您所要執行的操作不受支持,從根本上無法正常工作。

假設唯一的解決方法是您找到的解決方案:修補PTX代碼。但恐怕這在一般情況下可能不起作用。

編輯: 具體而言,OpenCL的支持比最NVIDIA GPU的支持較大網格,所以網格尺寸需要通過在多個實際電網分割進行虛擬化啓動,因此偏移量是必要的。同樣在OpenCL中,索引不一定從(0,0,0)開始,用戶可以指定驅動程序必須傳遞給內核的偏移量。因此,爲OpenCL和CUDA C啓動初始化的寄存器是不同的。

+0

爲什麼要投票? – harrism