每次编译cuda源码时md5sum的值都会变化

md5sum value changes every time I compile cuda source code

我试图通过 ubuntu 中的 md5sum 命令验证我的宏在编译期间是否真的有效。

例如,通过"nvcc -DTEST_MACRO ...."我得到了一个可执行文件A。 然后通过 "nvcc ..." 我得到了一个可执行文件 B。 当然 md5 值是不同的。 但是,我重新编译生成了A。它的md5和之前的不一样

我拿了一个纯c++的代码,用g++检查了一下,结果不管编译多少次,md5值都是一样的。所以我认为 nvcc 生成的可执行文件中有类似时间戳的东西。

我认为这种可变性不一定是由于嵌入的时间戳,而是 nvcc 构建可执行文件的方式。

nvcc 是一个编译器驱动程序,这意味着它会启动一系列命令 "under the hood" 来编译代码。在此序列的执行过程中,将使用随机生成的文件名创建各种临时文件。您可以通过查看添加了 -v 开关的 nvcc 编译命令的输出来了解这一点。

其中一些文件名 do 嵌入到可执行文件中,并且由于这些随机生成的文件名在 nvcc 编译命令的一次调用与下一次调用之间有所不同,生成的二进制文件会有所不同。

如果您想自己验证这一点,运行 您的 nvcc 命令添加了 -v。然后检查最后的输出是否有 tmpxft... 文件名。然后grep为该文件名生成的可执行文件,例如:

grep tmpxft_0000a76e myexe

(将 tmpxft_0000a76e 替换为 nvcc 详细输出中出现的任何内容,并将 myexe 替换为可执行文件的实际名称。)

如果您想验证 TEST_MACRO 是否真的有效,有几个选项。最不打扰的可能是将以下行放在 TEST_MACRO 正文中:

#ifdef TEST_MACRO
...
#warning TEST_MACRO_COMPILED
...
#endif

并且当您指定 -DTEST_MACRO

时,您应该会在编译期间看到此回显到输出中

(以上是一种有用的技术,可以避免在 production/release 代码构建中错误地包含调试宏和其他您不想要的内容。)

当然,可能还有很多其他的可能性。如果测试宏包含可执行代码,您可以在其中放置一个 printf 语句,以便在 运行 时查看证据。