0

我正在尝试编写一个简单的类来设置一维纹理中的数据。我有一个标题、一个正文和一个主文件。如果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 语法。

4

0 回答 0