我的问题与此链接非常相似,但我无法修复它。
我有一个使用 cuda 分层纹理的 CUDA 程序。此功能仅适用于 Fermi 架构(计算能力大于或等于 2.0)。如果 GPU 不是 Fermi,我使用 3d 纹理代替分层纹理。在声明纹理引用(纹理引用需要是全局的)时,我在代码中使用 __CUDA_ARCH__,如下所示:
#if __CUDA_ARCH__ >= 200
texture<float, cudaTextureType2DLayered> depthmapsTex;
#else
texture<float, cudaTextureType3D> depthmapsTex;
#endif
我遇到的问题是 __CUDA_ARCH__ 似乎没有定义。
我尝试过的事情:
1) __CUDA_ARCH__ 能够在 cuda 内核中正常工作。我从 NVCC 文档中知道 __CUDA_ARCH__ 无法在主机代码中正常工作。我必须将纹理参考定义为全局变量。它属于主机代码吗?正在编译的文件的扩展名为 .cu。
2)我有一个使用分层纹理正常工作的程序。然后我以两种方式添加 __CUDA_ARCH__ 宏:
#ifdef __CUDA_ARCH__
texture<float, cudaTextureType2DLayered> depthmapsTex;
#endif
和
#ifndef __CUDA_ARCH__
texture<float, cudaTextureType2DLayered> depthmapsTex;
#endif
我发现它们都不起作用。两者都有相同的错误。错误:标识符“depthmapsTex”未定义。看起来好像 MACRO __CUDA_ARCH__ 已定义但未同时定义。我怀疑这与编译有两个阶段有关,并且只有一个阶段可以看到 __CUDA_ARCH__,但我不确定到底发生了什么。
我使用 cmake + visual studio 10 设置项目并编译代码。我怀疑这里是否有什么问题。
我不确定我是否提供了足够的信息。任何帮助表示赞赏。谢谢!
编辑: 我试图在 Nvidia CUDA SDK 5.0 中找到使用 __CUDA_ARCH__ 的任何示例。以下代码从项目grabcutNPP中的文件GPUHistogram.h中的第20行到第24行提取。
#if __CUDA_ARCH__<300
#define PARALLEL_HISTS 64
#else
#define PARALLEL_HISTS 8
#endif
从第 216 行到第 219 行,它使用 MACRO PARALLEL_HISTS:
int gpuHistogramTempSize(int n_bins)
{
return n_bins * PARALLEL_HISTS * sizeof(int);
}
但是我发现这里有问题。PARALLEL_HISTS 未正确定义。如果我将第一个子句更改为#if defined(__CUDA_ARCH__)&& __CUDA_ARCH__<300,我发现CUDA_ARCH没有定义。CUDA SDK 示例是否以错误的方式使用CUDA_ARCH?