【问题标题】:write a cuda program to compile both sm_1x and sm_2x编写一个 cuda 程序来编译 sm_1x 和 sm_2x
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您想了解您的 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);
      

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

      【讨论】:

      • 这个我知道,但我需要知道编译时的GPU计算能力
      猜你喜欢
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 2014-07-07
      • 2019-09-16
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多