[英]Using C++ with CUDA
我剛剛開始使用CUDA,想知道如何最好地使用C ++的主機端 API。 我對任何C API的初步傾向是用內聯函數和方法包裝它,在錯誤返回時添加異常,以便它與我的其余代碼很好地融合。 我簡要地看了一下推力,但這似乎是一個更高級別的東西,並沒有包裝你可能需要使用的其他API。
是否存在我缺少的現有包裝器,或者是否有一些很好的理由直接使用我忽略的C API?
更新 :我確實找到了一個名為<Cuda>模板的庫 。 它比我想要的更抽象,所以我可能不會使用它,但我把這里作為參考,以防其他人有同樣的問題。
CUDA調用通常與內核調用密切相關。 例如,您可以使用cudaMalloc()
分配一些內存,然后在該內存上運行內核。 內核本身,調用內核的代碼(使用三重括號語法)和設置一些資源(如紋理)的代碼必須全部都在.cu文件中。
因此,我認為最好只創建小型C風格的庫,它們包含與一個內核(或幾個緊密相關的內核)相關的功能。 然后,如果需要,可以將C風格的庫包裝在C ++接口中。
因此,例如,C風格的圖書館可能有一個一個init()
設置了所需的內核運行中,所有資源調用compute()
調用一個或多個內核和呼叫deinit()
調用的FreeS一切。 然后,如果需要,您可以擁有一個C ++類,在其構造函數中調用init()
,在其析構函數中調用deinit()
,並使用檢查返回值的方法包裝compute()
調用,並可能拋出異常。
據我所知,沒有這樣的事情存在。 如果你想做的只是在出錯時拋出異常,可以考慮使用thrust::system_error
。
例如:
#include <thrust/system_error.h>
void my_cudaMalloc_wrapper(void **devPtr, size_t size)
{
cudaError_t error = cudaMalloc(devPtr, size);
if(error != cudaSuccess)
{
throw thrust::system_error(error, thrust::cuda_category());
}
}
thrust::system_error
派生自std::runtime_error
。 它的.what()
成員函數將為您解碼CUDA運行時錯誤:
#include <iostream>
void foo()
{
int *ptr = 0;
size_t n = 13;
try
{
my_cudaMalloc_wrapper(&ptr, n);
}
catch(std::runtime_error &error)
{
std::cerr << "Uh oh: " << error.what() << std::endl;
}
}
我的回答絕不是完整的。 根據我在研究CUDA時的記憶,您可以在這些內核中運行的代碼類型非常有限。 每個內核分配的私有內存空間非常少,因此不能有大堆棧,堆分配對象,以及C ++有用的所有好東西,這使得C ++對於CUDA目的來說幾乎沒用。 因此,即使有包裝紙,由於限制也不實用
你可以做到這一點。 但是,在最低級別用C ++替換C語言並不總是可行的。 例如,完整的RAII通常是低效的:在GPU上初始化陣列可能比在CPU上慢得多,並且通常可以例如用“單元化”模式設計內核來取代這個代價高昂的步驟。 你可以在C ++類中管理這類東西,但IMO把它放在一個額外的C層中更安全一些,沒有人希望一切都很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.