5

多かれ少なかれ、質問がすべてを物語っています。

calling a host function("std::pow<int, int> ") from a __device__/__global__ function("_calc_psd") is not allowed

私の理解では、代わりに cuda pow 関数を使用する必要がありますが、そうではありません。

4

1 に答える 1

7

エラーは、コンパイラーが報告されたとおりです。デバイスコードでホスト関数を使用することはできません。これには、ホストC++stdライブラリ全体が含まれます。CUDAには、プログラミングガイドで説明されている独自の標準ライブラリが含まれていますが、powまたはfpow(C ++または名前空間ではなくC標準ライブラリから取得)のいずれかを使用する必要があります。nvccは、cudaの正しいデバイス関数で関数をオーバーロードし、結果のコードをインライン化します。次のようなものが機能します。

#include <math.h>

__device__ float func(float x) {

   return x * x * fpow(x, 0.123456f);
}

編集:私が最初に見逃したビットは、エラーで報告されたテンプレート指定子です。powにfloatまたはdouble引数を渡してもよろしいですか?整数を渡す場合、CUDA標準ライブラリにオーバーロード関数がないため、失敗する可能性があります。整数のpow関数が必要な場合は、独自にロールする必要があります(またはキャストを実行しますが、powはかなり高価な関数であり、カスケードされた整数の乗算の方が高速であると確信しています)。

于 2011-04-14T05:46:48.953 に答える