2016-10-17 32 views
5

具體而言,我的問題是我有CUDA代碼需要運行<curand_kernel.h>。 NVRTC默認不包含此功能。假設在創建程序上下文(即調用nvrtcCreateProgram)時,我必須發送文件名(curand_kernel.h)以及curand_kernel.h的源代碼?我覺得我不應該那樣做。如何將標準CUDA庫包含在NVRTC代碼中?

很難說;我還沒有從NVIDIA的例子中找到需要像這樣的標準CUDA文件作爲源代碼的人,所以我真的不明白語法是什麼。有些問題:curand_kernel.h也包含...我是否也必須對每個問題都做同樣的事情?我甚至不確定NVRTC編譯器甚至可以在curand_kernel.h上正確運行,因爲它有一些它不支持的語言功能,不是嗎?

下一頁:如果你已經發送了一個頭文件的源代碼到nvrtcCreateProgram,我是否仍然需要在代碼中執行#include /如果我這樣做會導致錯誤?

這樣做的代碼或類似的代碼的鏈接將不勝感激直接的答案;我真的沒有設法找到任何。

回答

6

您必須分別發送每個標題的「文件名」和來源。

當預處理器完成它的工作時,它將使用任何#include文件名作爲關鍵字,根據您提供的集合找到標題的來源。

我懷疑,在這種情況下,編譯器(驅動程序)沒有文件系統訪問權限,因此您必須以與OpenGL中着色器包含的方式大致相同的方式給它提供源代碼。

所以:調用nvrtcCreateProgram

  • 包括你的頭名。編譯器將在內部生成一個std::map<string,string>的等效項,其中包含由給定名稱索引的每個頭的源。

  • 在您的內核源代碼中,照常使用#include "foo.cuh"

  • 編譯器將使用foo.cuh作爲索引或鑰匙插入其內部映射(時創建稱爲nvrtcCreateProgram),並將從該集合中檢索的報頭源

  • 彙編正常進行。

一個是nvrtc提供的功能,只是一個「子集」是編譯器在一定程度上沙盒環境戲劇,而不必所有的支持工具和實用程序躺在身邊,你必須離線編輯的原因。所以,你必須手動處理正常的nvcc + (gcc | MSVC| clang)組合提供的許多東西。

一個可能的但非理想的解決方案是預處理您在IDE中需要的文件,保存結果,然後保存結果,然後輸入#include。但是,我敢打賭有一個更好的方法來做到這一點。如果您只想要curand,請考慮潛入庫中並提取所需的部分(Blech)或使用另一種適合GPU的rand實現。在較舊的CUDA版本中,我只是在主機上生成一大堆隨機的浮點數,將其上傳到GPU並在內核中採樣。

This related link may be helpful

+0

嗯。所以我有一些想法來做這件事。預編譯使用curand到PTX中的代碼是不可行的...在CPU上預生成浮點數是不可行的,因爲需要太多的...因此,我只剩下在curand庫中工作獲取我需要使用NVRTC編譯的部分,並找到rand的另一個實現。 我從curand真正需要的是從0到1的標準統一PRNG,我認爲解決方案是找到另一個使用NVRTC更容易編譯的PRNG,謝謝! –

+0

嗯。 PRNG的GPU實現很難實現。也許我必須以某種方式適應CURAND ... –

+0

@BillySmith最直接的解決方案是構建一個大緩衝區並使用rand()或類似的CPU端填充它,然後將其上傳到主機。保持索引變量指示緩衝區中的「下一個」值。當你擊中緩衝區的末端時,沖洗並重復。 –