编写一个cuda程序来编译sm_1x和sm_2x

时间:2012-12-20 18:23:37

标签: cuda

我的问题与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 __)&amp;&amp; __CUDA_ARCH __&lt; 300 ,我发现未定义 CUDA_ARCH 。 CUDA SDK示例是否以错误的方式使用 CUDA_ARCH

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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);

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