2

我的问题与此链接非常相​​似,但我无法修复它。

我有一个使用 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

4

2 回答 2

1

我不确定我是否理解可能有一个优雅解决方案的确切问题。这是我过去使用的一种不雅的蛮力方法。在两个单独的 .cu 文件中创建两个具有相同签名但名称不同的内核(例如 foo_sm10()、foo_sm20()。为 sm_10 编译一个文件,为 sm_20 编译另一个文件。将独立于计算能力的通用代码移动到头文件,并从前面提到的两个 .cu 文件中包含它。在主机代码中,创建一个函数指针以调用依赖于体系结构的内核。根据计算能力初始化指向适当的体系结构依赖内核的函数指针在运行时检测到。

于 2012-12-20T20:47:09.790 回答
0

如果你想弄清楚你的 GPU 的计算能力,你可以尝试这样的事情:

int devID;    
cudaDeviceProp props;
CUDA_SAFE_CALL( cudaGetDevice(&devID) );
CUDA_SAFE_CALL( cudaGetDeviceProperties(&props, devID) );

float cc;
cc = props.major+props.minor*0.1;
printf("\n:: CC: %.1f",cc);

但我不知道如何解决你的问题。

于 2012-12-20T19:43:52.527 回答