【发布时间】:2012-12-21 15:33:36
【问题描述】:
我的问题与this link 非常相似,但我无法解决。
我有一个使用 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__,我发现 CUDA_ARCH 没有定义。 CUDA SDK 示例是否以错误的方式使用 CUDA_ARCH?
【问题讨论】:
标签: cuda