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