の間で問題選択するプリプロセッサを使用して:.Hを持つCUDAとNVCC:floatまたはdouble
を、私はC/C++用や計算能力を持つCUDA用にコンパイル場合は2倍に本物を定義したいです> = 1.3。コンピューティング能力が<のcudaのためにコンパイルする場合は、realをfloatに定義します。私はこれに来た多くの時間(動作しない)
# if defined(__CUDACC__) # warning * making definitions for cuda # if defined(__CUDA_ARCH__) # warning __CUDA_ARCH__ is defined # else # warning __CUDA_ARCH__ is NOT defined # endif # if (__CUDA_ARCH__ >= 130) # define real double # warning using double in cuda # elif (__CUDA_ARCH__ >= 0) # define real float # warning using float in cuda # warning how the hell is this printed when __CUDA_ARCH__ is not defined? # else # define real # error what the hell is the value of __CUDA_ARCH__ and how can I print it # endif # else # warning * making definitions for c/c++ # define real double # warning using double for c/c++ # endif
私は(-archフラグに注意してください)
nvcc -arch compute_13 -Ilibcutil testFloatDouble.cu
をコンパイルするとき、私は
* making definitions for cuda __CUDA_ARCH__ is defined using double in cuda * making definitions for cuda warning __CUDA_ARCH__ is NOT defined warning using float in cuda how the hell is this printed if __CUDA_ARCH__ is not defined now? Undefined symbols for architecture i386: "myKernel(float*, int)", referenced from: ....
を取得した後
私はファイルがnvccによって2回コンパイルされることを知っています。最初のものはOKです(CUDACCが定義され、CUDA_ARCH> = 130)が、2回目はどうなりますか? CUDA_DEFINED but CUDA_ARCH未定義または値< 130?どうして ?
お時間をいただきありがとうございます。今の私が見る唯一の現実的な解決策は、カスタムを使用している
非常に良い貢献、私はそれを保つ。残念ながら私の実際の問題については、それが実現可能かどうかを確認する必要があります。私たちは、cuda(floatとdouble)で使用できるようにdoubleで書かれた既存のc/C++ライブラリ(.hと.cの多く)を移植/拡張しています。私たちは二重を現実のものに置き換えました。そして、現実の一貫した定義を二重にするか、状況に応じて浮動させたいと思っています。現在の関数ヘッダーをテンプレートとしてどのように機械的に翻訳するかについて考える必要があります。最も重要なのは、純粋なCを使用したいユーザーにとってはそれが受け入れられるかどうかです。ありがとう。 – cibercitizen1
また、私はadd()の定義が#ifdef __CUDACC__の内側にあることに気づいていませんでした。しかし、それを使用するためのc/C++コードでも利用できるはずです。 – cibercitizen1
最後のポイントに - いいえ。定義上、デバイスコードと、カーネル<<<> >>構文を使用してcudaカーネルを呼び出すホストコードは、nvccでコンパイルする必要があります。また、コンパイルのホストとデバイスの両方の軌道に対して、カーネル定義のために内部的に生成されたエントリスタブ関数が必要であるため、カーネル定義を使用可能にする必要があります。通常のCまたはC++コードからカーネルを呼び出す場合は、.cuファイル内にC/C++ラッパーが必要です。または、ドライバAPIを使用して、cubinまたはJITコンパイルPTXをロードしてください。 – talonmies