Cuda 如何从代码的主机部分获得GPU的当前计算能力?

Cuda 如何从代码的主机部分获得GPU的当前计算能力?,cuda,visual-studio-2017,compile-time,nvcc,preprocessor-directive,Cuda,Visual Studio 2017,Compile Time,Nvcc,Preprocessor Directive,我试图使用\uuuu CUDA\u ARCH\uuuu,但我在某个地方读到,这只适用于代码的设备部分。 之后,我在github上遇到了以下代码: 有没有更好的方法来实现这一点 我这样问是因为我想确定(在主机代码上)GPU是否支持统一内存,在这种情况下,cudaMallocManaged将发生,或者cudaMallocs&&cudaMemcpys将发生 我想做的示例: int main() { // IF CUDA >= 6.0 && COMPUTE CAPABILITY

我试图使用
\uuuu CUDA\u ARCH\uuuu
,但我在某个地方读到,这只适用于代码的设备部分。 之后,我在github上遇到了以下代码:

有没有更好的方法来实现这一点

我这样问是因为我想确定(在主机代码上)GPU是否支持统一内存,在这种情况下,cudaMallocManaged将发生,或者cudaMallocs&&cudaMemcpys将发生

我想做的示例:

int main() {
  // IF CUDA >= 6.0 && COMPUTE CAPABILITY >= 3.0
      // USE cudaMallocManaged
  // ELSE
      // USE cudaMallocs && cudaMemcpys
  // END IF
  return 0;
}

这里似乎涉及两个问题:

  • 我如何(在编译时)查询正在编译特定代码的CUDA运行时API版本,以便确定使用某些运行时API元素(例如与托管内存关联的元素)是否安全,这些元素可能只出现在较新的运行时API版本中

    已经讨论了一种方法。作为此特定案例的浓缩版本,您可以执行以下操作:

    #include <cuda_runtime_api.h>
    ...
    // test for CUDA version of 6.0 or higher
    #if CUDART_VERSION >= 6000 
    // safe to use e.g. cudaMallocManaged() here
    #else
    // e.g. do not use managed memory API here
    #endif
    
    #包括
    ...
    //测试CUDA 6.0或更高版本
    #如果CUDART\U版本>=6000
    //可安全使用,例如此处的cudaMallocManaged()
    #否则
    //例如,此处不要使用托管内存API
    #恩迪夫
    
  • 如何确定是否可以在运行时使用托管内存

    如评论中所述,如果您已经确定编译所针对的CUDA版本为CUDA 6.0或更高版本(例如,见上文),那么您应该在尝试使用
    cudamalocmanaged
    之前测试对托管内存的支持。
    deviceQuery
    表示在运行时测试功能的一般方法(例如,使用测试
    managedMemSupported
    属性)


  • 我认为SDK中有一个获得计算能力的代码示例。@PaulR所以你建议我应该使用
    \uuuuu host\uu​cudaError\u t cudaGetDeviceProperties(cudaDeviceProp*prop,int设备)
    并从
    managedMemSupported
    变量读取值。如果我想用一些旧的CUDA API编译完全相同的代码,而这些API甚至没有什么
    cudamalocmanaged
    的定义,那该怎么办?我不知道-我已经很久没有用CUDA做过任何工作了-我只记得SDK中有一个代码示例报告了计算能力,仅此而已。@PaulR哦,好的!无论如何,谢谢!;)注意:通过
    cudaGetDeviceProperties()
    查询计算能力之间存在差异:前者给出了设备的实际计算能力,而后者给出了设备代码编译的计算能力。如果不同的计算能力设备是二进制兼容的,或者如果PTX代码被驱动程序转换为实际的体系结构,它们可能会有所不同。