【问题标题】:executables with nvcc are larger than with gcc/g++ and OpenCLnvcc 的可执行文件比 gcc/g++ 和 OpenCL 的大
【发布时间】:2015-09-11 10:59:12
【问题描述】:

这只是我注意到的事情,并且很好奇是否有原因。

在 Ubuntu 14.04 上使用 Nvidia 的 nvcc 编译器从它的 cuda 7.0 工具包编译一些标准的 helloworld 代码会产生以下大小的可执行文件:

liang@liang-EX58-UD3R:~/Documents/cuda-test$ nvcc cudahello.cu -o cudahello
liang@liang-EX58-UD3R:~/Documents/cuda-test$ ls -lah cudahello
-rwxrwxr-x 1 liang liang 508K Jun 25 12:08 cudahello

该程序只是一个简单的 hello world 程序,没有内核调用:

//cudahello.cu
#include <iostream>

int main(){
    std::cout << "helloworld\n";
    return 0;
}

另一方面,OpenCL 是 C++ 可执行文件的预期大小:

liang@liang-EX58-UD3R:~/Documents/opencl-test$ g++ -Wall -std=c++11 oclhello.cpp -lOpenCL -o oclhello
liang@liang-EX58-UD3R:~/Documents/opencl-test$ ls -lah oclhello
-rwxrwxr-x 1 liang liang 8.9K Jun 25 12:08 oclhello

这也是一个简单的helloworld程序:

//oclhello.cpp
#include <CL/cl.h>
#include <iostream>

int main(){
    std::cout << "helloworld";
    return 0;
}

CUDA 可执行文件大得多有什么原因吗? 我发现即使在 C/C++ 程序中使用 OpenCL 函数,可执行文件也不会增长到 CUDA 可执行文件的大小。

【问题讨论】:

  • 我对@9​​87654325@ 了解不多,但是您是否将可执行文件与调试信息进行比较?尝试剥离两个可执行文件 (strip cudahello oclhello) 并比较它们的大小。还要比较它们链接到的库(使用ldd)。 nvcc 可能是静态链接,而g++ 是动态链接。
  • 嗯不太清楚strip,但我实际上已经在gcc和从相同代码编译的nvcc二进制文件之间进行了比较,发现nvcc程序与gcc有很多共同之处,除了对于可执行文件某处的 blob 中的大量额外数据。
  • 重要的是要记住 nvcc 不是编译器。它是一个 compiler drvier - 它引导编译,但仅此而已。在这两种情况下,都使用相同的 g++ 编译器。 nvcc 所能做的就是更改编译和链接器选项(在这种情况下,选项是静态链接 CUDA 运行时库)

标签: c++ cuda g++ opencl nvcc


【解决方案1】:

主要区别在于,在您的 CUDA 案例中,您静态地链接到 libcudart,即 cuda 运行时库,它至少会增加约 500K 的可执行文件大小。

openCL 可执行文件动态链接到 libOpenCL.so,这意味着该库的大小不会影响可执行文件的大小。

要实现近似奇偶校验,请将您的 cuda 应用程序与附加开关链接:

--cudart shared

这将force dynamic linking to libcudart,并且CUDA可执行文件大小将下降很多。

您还可以使用ldd 观察链接差异。

【讨论】:

  • 似乎合乎逻辑,谢谢 rob! liang@liang-EX58-UD3R:~/Documents/cuda-test$ nvcc --cudart shared cudahello.cu -o cudahello liang@liang-EX58-UD3R:~/Documents/cuda-test$ ls -lah cudahello -rwxrwxr-x 1 liang liang 15K Jun 25 16:02 cudahello
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2012-11-26
  • 1970-01-01
  • 2011-11-25
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多