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