2

私は CUDA を使い始めたばかりで、C++ でホスト側API を使用する最善の方法を考えています。C API に対する私の最初の傾向は、それをインライン関数とメソッドでラップし、エラーが返されたときに例外を追加して、コードの残りの部分とうまく調和させることです。私は簡単に推力を見てきましたが、それははるかに高いレベルのもののようであり、使用する必要があるかもしれない他の API をラップしていません。

不足している既存のラッパーはありますか、それとも見落としていた C API を直接使用する正当な理由はありますか?

更新: <Cuda> templatesと呼ばれる、探していたものに沿ったライブラリを見つけました。思った以上に抽象的なので使わないかもしれませんが、他の人が同じ質問をした場合の参考としてここに置いておきます。

4

4 に答える 4

4

CUDA呼び出しは通常、カーネル呼び出しと密接に関連しています。たとえば、メモリを割り当ててcudaMalloc()から、そのメモリでカーネルを実行する場合があります。カーネル自体、カーネルを呼び出すコード(トリプルブラケット構文を使用)、およびテクスチャなどのリソースを設定するコードは、すべて.cuファイルに含まれている必要があります。

このため、1つのカーネル(またはいくつかの密接に関連するカーネル)に関連する機能をラップする小さなCスタイルのライブラリを作成するのが最善だと思います。次に、必要に応じて、そのCスタイルのライブラリをC++インターフェイスにラップすることができます。

したがって、たとえば、Cスタイルのライブラリにはinit()、カーネルの実行に必要なすべてのリソースを設定するcompute()呼び出し、1つ以上のカーネルを呼び出す呼び出し、およびdeinit()すべてを解放する呼び出しが含まれる場合があります。次に、必要に応じて、init()コンストラクターとdeinit()デストラクタをcompute()呼び出し、戻り値をチェックして例外をスローする可能性のあるメソッドで呼び出しをラップするC++クラスを作成できます。

于 2012-06-13T17:07:45.443 に答える
2

私の知る限り、そのようなものは存在しません。エラー時に例外をスローするだけの場合は、 の使用を検討して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;
  }
}
于 2012-06-13T01:07:12.750 に答える
1

出来るよ。ただし、Cイディオムを最下位レベルのC++イディオムに置き換えることが常に実行可能であるとは限りません。たとえば、完全なRAIIを実行することは、多くの場合非効率的です。アレイの初期化は、CPUよりもGPUで大幅に遅くなる可能性があり、たとえば、このコストのかかるステップを置き換える「ユニタライズ」モードでカーネルを設計することが可能です。この種のものはC++クラスで直接管理できますが、IMOは、すべてが適切にRAIIされることを誰も期待していない、追加のCレイヤーに配置する方がいくらか安全です。

于 2012-06-12T21:49:23.570 に答える
1

私の答えは決して完全ではありません。私が CUDA を研究していたときのことを思い出すと、これらのカーネルで実行できるコードの種類は非常に限られています。各カーネルに割り当てられるプライベート メモリ スペースは非常に少ないため、大きなスタック、ヒープ割り当てオブジェクト、および C++ が適しているすべての優れた機能を使用することはできません。これにより、C++ は CUDA の目的にはほとんど役に立たなくなります。したがって、ラッパーがあったとしても、制限のために使用するのは実用的ではありません

于 2012-06-12T21:26:11.460 に答える