- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题 :
如果为 c/c++ 或具有计算能力 >= 1.3 的 cuda 编译,有一个 .h,我想将 real 定义为 double。如果为计算能力 < 1.3 的 cuda 编译,则将 real 定义为 float。
几个小时后,我来到了这个(这不起作用)
# 如果已定义(__CUDACC__)
# 警告 * 为 cuda 制定定义
# 如果已定义(__CUDA_ARCH__)
# 警告 __CUDA_ARCH__ 已定义
# 别的
# 警告 __CUDA_ARCH__ 未定义
# 万一
# 如果 (__CUDA_ARCH__ >= 130)
# 定义真正的双
# 在 cuda 中使用 double 的警告
# elif (__CUDA_ARCH__ >= 0)
# 定义真正的浮点数
# 在 cuda 中使用 float 的警告
# 警告当 __CUDA_ARCH__ 未定义时,这到底是怎么打印的?
# 别的
# 定义真实
# 错误 __CUDA_ARCH__ 的值到底是什么,我该如何打印它
# 万一
# 别的
# 警告 * 为 c/c++ 定义
# 定义真正的双
# 在 c/c++ 中使用 double 的警告
# 万一
当我编译时(注意 -arch 标志)
nvcc -arch compute_13 -Ilibcutil testFloatDouble.cu
我得到
* 为 cuda 制定定义
__CUDA_ARCH__ 已定义
在 cuda 中使用 double
* 为 cuda 制定定义
警告 __CUDA_ARCH__ 未定义
在 cuda 中使用 float 警告
如果 __CUDA_ARCH__ 现在没有定义,这到底是怎么打印的?
架构 i386 的 undefined symbol :
“myKernel(float*, int)”,引用自:....
我知道文件被 nvcc 编译了两次。第一个没问题( CUDACC 定义和 CUDA_ARCH >= 130)但是第二次会发生什么?
CUDA_DEFINED 但是 CUDA_ARCH 未定义或值 < 130?为什么 ?
谢谢你的时间。
最佳答案
似乎您可能将两件事混为一谈——当 nvcc 处理 CUDA 代码时如何区分主机和设备编译轨迹,以及如何区分 CUDA 和非 CUDA 代码。两者之间存在细微差别。 __CUDA_ARCH__
回答第一个问题,__CUDACC__
回答第二个问题。
考虑以下代码片段:
#ifdef __CUDACC__
#warning using nvcc
template <typename T>
__global__ void add(T *x, T *y, T *z)
{
int idx = threadIdx.x + blockDim.x * blockIdx.x;
z[idx] = x[idx] + y[idx];
}
#ifdef __CUDA_ARCH__
#warning device code trajectory
#if __CUDA_ARCH__ > 120
#warning compiling with double precision
template void add<double>(double *, double *, double *);
#else
#warning compiling with single precision
template void add<float>(float *, float *, float *);
#else
#warning nvcc host code trajectory
#endif
#else
#warning non-nvcc code trajectory
#endif
nvcc
引导的主机代码,以及一个用于编译不受
nvcc
引导的主机代码的节。其行为如下:
$ ln -s cudaarch.cu cudaarch.cc
$ gcc -c cudaarch.cc -o cudaarch.o
cudaarch.cc:26:2: warning: #warning non-nvcc code trajectory
$ nvcc -arch=sm_11 -Xptxas="-v" -c cudaarch.cu -o cudaarch.cu.o
cudaarch.cu:3:2: warning: #warning using nvcc
cudaarch.cu:14:2: warning: #warning device code trajectory
cudaarch.cu:19:2: warning: #warning compiling with single precision
cudaarch.cu:3:2: warning: #warning using nvcc
cudaarch.cu:23:2: warning: #warning nvcc host code trajectory
ptxas info : Compiling entry function '_Z3addIfEvPT_S1_S1_' for 'sm_11'
ptxas info : Used 4 registers, 12+16 bytes smem
$ nvcc -arch=sm_20 -Xptxas="-v" -c cudaarch.cu -o cudaarch.cu.o
cudaarch.cu:3:2: warning: #warning using nvcc
cudaarch.cu:14:2: warning: #warning device code trajectory
cudaarch.cu:16:2: warning: #warning compiling with double precision
cudaarch.cu:3:2: warning: #warning using nvcc
cudaarch.cu:23:2: warning: #warning nvcc host code trajectory
ptxas info : Compiling entry function '_Z3addIdEvPT_S1_S1_' for 'sm_20'
ptxas info : Used 8 registers, 44 bytes cmem[0]
__CUDACC__
定义 nvcc
是否为转向编译 __CUDA_ARCH__
在编译主机代码时总是未定义的,由 nvcc
引导或不 __CUDA_ARCH__
仅定义为nvcc
nvcc
编译的代码。
nvcc
文档有时有点简洁,但所有这些都包含在关于编译轨迹的讨论中。
关于CUDA 和 nvcc : using the preprocessor to choose between float or double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8796369/
我正在考虑在某些项目中使用 Boost.Preprocessor,但我不想让整个 Boost 库成为依赖项。 我可以单独复制它并摆脱它吗?否则,它的依赖项是什么? 最佳答案 新答案 我刚刚让 bcp
从我关于 appending to CPP macros 的问题中分离出来: 这里有没有人用过Boost.Preprocessor库的数据类型来实现类似 X 宏的东西? 最佳答案 我只是查了一下 X-
我想用不同的预处理器运行 Karma 几次。基于失败,karma exec 在命令行上监听 --preprocessors,但我无法正确设置它。 以下都返回相同的错误。 karma start --s
我有一个带有预处理器指令的Inno Setup脚本(#define,#if等)。 我想在脚本上运行Inno Setup预处理器,并查看预处理器的输出(以Inno-Setup口语翻译)。也就是说,我要查
在我的项目中,ifdef预处理程序指令中包含一个文件 #ifdef SOME_SYMBOL ... entire file ... #endif SOME_SYMBOL由在此文件之前编译的另一个文件定
在tracing.hh中,我有一组调试宏。它是否生成代码和输出由实际源代码中的宏标志控制: // File: foo.cc #define TRACING 0 #include "tracing.h
我了解 ANN 输入必须标准化、标准化等。 撇开各种 ANN 的特性和模型不谈,在将其作为神经网络的输入之前,如何在 {0,1} 范围内或在 {-1,1} 范围内预处理 UTF-8 编码文本? 我一直
我正在选修数据挖掘本科类(class),并且收到了编写数据挖掘预处理器的作业。我可以自由选择编程语言和数据集。我想知道是否有人可以建议一个好的数据集来使用。我一直在经历UCI Repository我还
当我同时定义两条指令时,如何做到这一点,我会收到编译错误? 在这里我想要错误 #define ENG #define POL #if defined POL #if defined ENG 这里没有
LLVM libc++ 头文件有一个宏,用于函数声明,名为 _LIBCPP_INLINE_VISIBILITY . 我不明白这是什么意思;我查看了它的定义,它说: // Just so we can
我正在使 1991 年的代码在 Ubuntu 19 上运行。 我有这个文件,我需要通过 CPP 运行,我被迫使用 -traditional 选项。 #define ITEM_WEAPON 5 #def
我想使用预处理器注释一行: #define open /##* #define close */ main() { open commented line close } 当我这样做时
我不敢相信我会问这个...... 好久没用VC6了。我设置了我认为是包含文件附加目录的正确方法(我删除了另一个开发人员的硬编码路径)并放入如下内容: %MY_DIR%\包括 但这行不通。我错过了什么吗
有预处理器宏定义其中的函数名称,__func__对于 g++ 和 __FUNCTION__对于 CL。 ( func 是执行此操作的 C++ 标准方法(来自 dcl.fct.def.general),
这个问题已经在这里有了答案: 9年前关闭。 Possible Duplicate: C preprocessor: using #if inside #define? 在define的rhs中包含预处
考虑这个代码: #define N_ 0 #define N_X 1 #define M(a) N_ M(arg)X; // #1 -- I'd like this to expand to
在 C /C++ 有两种类型的宏: #define ABC /* usual */ 和 #define FUNC(a) /*function-like*/ 但是我怎么能取消定义它们呢? 更新
有没有办法在编译时而不是在运行时有条件地做到这一点? “标志”将永远是一个常数。 A() 和 B() 是宏。 #define DEMO(flag, p) if (flag) A(p); else B(
是否有某种方法可以将 pragma 语句与其他语句一起嵌入到宏中? 我正在努力实现以下目标: #define DEFINE_DELETE_OBJECT(type)
是否可以在 C 中编写自定义条件预处理器指令。例如; #define _IF_ (condition, explanation) \ #ifdef condition 每条评论都会很棒,
我是一名优秀的程序员,十分优秀!