簡體   English   中英

使用C ++和CUDA

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM