C++ CUDA退房nvcc“-“拱门”-运行时标记

C++ CUDA退房nvcc“-“拱门”-运行时标记,c++,cuda,nvcc,C++,Cuda,Nvcc,是否有可能调用不同的内核,这取决于编译代码时是否使用了例如nvcc-arch=sm_11或nvcc-arch=sm_20?更明确一点: if (FANCY_FLAG == CU_TARGET_COMPUTE_11) // Do some conversions here.. krnl1<<<GRID_DIM1, BLOCK_DIM1>>>(converted_value1); else if (FANCY_FLAG == CU_TARGET_C

是否有可能调用不同的内核,这取决于编译代码时是否使用了例如
nvcc-arch=sm_11
nvcc-arch=sm_20
?更明确一点:

if (FANCY_FLAG == CU_TARGET_COMPUTE_11)
    // Do some conversions here..
    krnl1<<<GRID_DIM1, BLOCK_DIM1>>>(converted_value1);
else if (FANCY_FLAG == CU_TARGET_COMPUTE_20)
    krnl2<<<GRID_DIM2, BLOCK_DIM2>>>(value1);
if(FANCY\u FLAG==CU\u TARGET\u COMPUTE\u 11)
//在这里做一些转换。。
krnl1(换算值1);
else if(FANCY_FLAG==CU_目标_计算_20)
krnl2(值1);
如您所见,我在
cuda.h
中找到了
CUjit\u target\u enum
,但我无法确定nvcc是否定义了任何等于枚举值之一的标志

我的目的是不知道我的设备是否支持双精度浮点。这意味着我必须将数据从
double
转换为
float
,因此,运行不同的内核(是的,我希望尽可能以双精度而不是单精度运行内核)

我也很欣赏一种完全不同的方法,只要它能奏效

  • 在设备代码中,检查宏值
  • 在主机代码中-检查设备属性的
    major
    minor
    字段

  • 看看,你的问题有一个解决方案。它不是运行时检查,但它做到了这一点。只看大调和小调,最好调用双内核。但由于您是为cc1.1编译的,所以该内核并不存在。您如何克服大调/小调不符合CUDA_ARCH的限制?编写一个只返回CUDA_ARCH的额外内核是否合理?您可以调用内核一次,并将其返回值存储在某个位置?CUDA_ARCH反映了编译选项。它的值并不反映当前设备-也就是说,如果使用ARCH=compute_11(sm_11代码将仅在sm 1.1设备上运行),任何兼容的CUDA设备上的CUDA_ARCH都将为110。您应该使用条件编译来编写特定设备的代码(例如#if CUDA_ARCH>=130#else#endif)。然后,您需要为几种体系结构编译代码。CUDA驱动程序将为适当的架构加载一个映像,因此在这种情况下不必做任何特定的事情。另外要考虑的是,对于不同的设备具有不同的内核——那么您可以根据设备属性选择内核来运行。作为对我最初问题的回答。我的问题是如何在主机代码中知道当前可用的内核。由于主机轨迹中没有_CUDA_ARCH_,因此我无法检查它。关键是,我需要随时将数据转换为float#如果CUDA#u ARCH>=130#否则#endif求值为。那么我该怎么办呢?你检测设备,然后根据设备的性能准备数据。e、 g.如果(device.major==1&&device.minor>2)| | device.major>1{}else{