每次编译cuda源代码

时间:2015-05-24 03:27:37

标签: c++ compilation cuda macros timestamp

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

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

我使用纯c ++代码并使用g ++进行检查,无论我编译多少次,它的md5值都是相同的。所以我认为nvcc生成的可执行文件中有时间戳。

  • 出于好奇,如何验证我的想法是否合适?
  • 无论如何,如何判断“TEST_MACRO”在这种情况下是否真的有效?

1 个答案:

答案 0 :(得分:3)

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

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

其中一些文件名 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

时,您应该在编译期间看到这个回显到输出

(以上是一种有用的技术,可以避免错误地包含调试宏以及您在生产/发布代码构建中不需要的其他内容。)

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