1D テクスチャにデータを設定する単純なクラスを作成しようとしています。ヘッダー、ボディ、メイン ファイルがあります。Atmosphere::initialize()
関数がファイルで定義されている場合、テクスチャ ルックアップは正しく実行されmain
ます。Atmosphere::intitialize()
ファイルに関数が定義されていると正しく動作しませんAtmosphere.cu
。
// Atmosphere.h
texture<float4, cudaTextureType1D, cudaReadModeElementType> Atmospheres;
class Atmosphere {
public:
Atmosphere() {
}
void initialize();
};
これがAtmosphere.cu
ファイルです。
// Atmosphere.cu
void Atmosphere::initialize() {
// omitted for brevity, setting up a 1D texture
}
そしてmain.cu
ファイル:
int main(void) {
Atmosphere atmo;
atmo.initialize();
// cuda stuff
queryAtmosphere<<<1, 1>>>(altitude, d_out);
cudaMemcpy(h_out, d_out, sizeof(float4), cudaMemcpyDeviceToHost);
std::cout << *h_out << std::endl;
// cuda stuff
}
の定義をファイルに入れると、出力は次のようAtmosphere::initialize()
になります。main.cu
x: 1.25, y: 300, z: 60, w: -60
Atmosphere.cu
しかし、定義をファイルに残すと、結果は次のようになります。
x: 0.0, y: 0.0, z: 0.0, w: 0.0
これは、コードに行う些細で問題のない変更のように思えますが、悲惨な結果をもたらします。initialize()
別のファイルで関数を定義すると検索エラーが発生する理由がわかりません。
どうしてこれなの?私はtexture
文献に注ぎ込み、多くの例を作成しましたが、この動作に直接対処するものはありません. main
ファイル内の関数定義が、ファイル内で定義された関数定義とは異なる動作をするのは奇妙に思えAtmosphere.cu
ます。
ノート:
簡潔にするために、多くの CUDA 固有のコードを省略しました。特定の CUDA 構文よりも、紛らわしい動作に関心があります。