有人可以向我解释以下纹理行为吗?

时间:2013-06-26 17:50:57

标签: c++ cuda gpu

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

0 个答案:

没有答案