Skip to main content

Cross Building Mingw-w64 Toolchain on macOS

· 3 min read

In this blog, we will show the steps of building Mingw-w64 on macOS system. In fact, we can install mingw-w64 corss building toolchain by homebrew package manager. Here, we jsut analysis the building steps of mingw-w64 toolchain, and it can be easily migrated to linux system.

Overview

We need to build following tools/libraries:

  • binutils: "Binutils is a collection of binary programming tools used to assemble, link and manipulate binary and object files.", like gnu linker ld, gnu assembler as, nm, ar and strings. see more.
  • texinfo: Apple's makeinfo is old and has bugs. It be only used as building dependency.
  • gcc: compiler for c/c++/fortran language.
  • mingw-w64: "The mingw-w64 project is a complete runtime environment for gcc to support binaries native to Windows 64-bit and 32-bit operating systems.". Provide windows api headers, runtime and other tools.

Build GNU-free Toolchain

· 10 min read

在linux上,最为受欢迎的 C/CXX 编译器之一就是 gcc 系列了,其使用 GNU 协议开源。 除此之外,还有基于llvm的现代编译器 clang/clang++,它则使用更为宽松的 BSD 协议开源。 关于两者的比较,可以参见这里

本文将尝试编译一套与 gnu 编译器无关的基于 clang 的工具链。 clang 是用C++写的,其依赖于 C 和 C++ 标准库,C++ ABI 库,以及 stack unwinder(实际上,我们编译其他的c/c++源代码也离不开三种)。
在clang编译器工具链中,我们可以采用 musl, libcxx, libc++abilibunwind 四个库来完成。 其中,libc++, libc++abi 和 libunwind 属于llvm 自己开发的 C++ 运行时(C++ runtime)。

clang系列编译器GNU 编译器
C标准库muslglibc
C++标准库libcxxlibstdc++
C++ ABI 库libc++abilibgcc(?不确定)
stack unwinderlibunwindlibgcc

需要指出的是,使用clang系列编译器时,也可以链接 GUN 的 glibc, libstdc++, libgcc 库, 这里我们为了与GNU无关,则把这个选择直接忽略。

这里插一句libcglibc的区别, 我们在编译程序时,使用ldd命令,可以看到二进制程序的链接库,而且大部分程序都会依赖于 libc。 在linux系统下,系统默认会有一个libc的库,大多数系统里面的这个libc库就是glibc,系统的大多数程序也都依赖于该库。
glibc是C标准库的一个实现,而在较早之前 linux 有自己的C标准库实现,后来改用使用glibc,而自己原先带libc库不再维护。

回到正题,C标准库,除了glibc的实现外,还有另一个开源实现 musl,采用 MIT 协议。 就C++标准库而言,llvm 也有一个实现,叫 libc++

libc++ is an implementation of the C++ standard library, targeting C++11, C++14 and above. All of the code in libc++ is dual licensed under the MIT license and the UIUC License (a BSD-like license).

写给新生的高性能计算入门(一) —— 高性能计算国内外发展现状及发展趋势

· 10 min read

说起超级计算机,大家应该会有一个概念,大致就是计算能力很强的计算机。甚至在某乎,还有人问 在超算上面打游戏是什么体验。 这里解释一下,实际上,由于超算系统的限制,很少能够可以连接互联网,而且远程连接网络性能也可能不好; 还有就是,游戏的程序并没有做大规模并行化(实际上也没必要),顶多只能单节点多核运行(可能还没GPU),所以打游戏的计算性能和单个普通服务器的性能差不多。对于超算来说,其强势主要在于计算能力(而且为了保证你的程序可以利用上超算的计算资源,需要针对超算环境去编写/改写并行程序,这个我们后面讨论并行编程的时候会讲)。

在高性能计算领域,有一个榜单 top500,该榜单每半年(6月份和11月份)公布一次世界上计算能力前500的超级计算机,其中6月份是在ISC(the International Supercomputing Conference)大会上公布,11月份是在SC(SuperComputing Conference)大会上公布。 该榜单最早由Hans MeuerErich StrohmaierJack Dongarra于1993年发起。

超算中的基本概念

节点(nodes)

简单来说,超算就是有很多计算节点,通过高速互联网络连接而成的计算机系统。每个节点实际上是一台比较独立的计算机,每个节点上可能会有多块 CPU 、加速计算硬件(如GPU、Intel phi等)、内存、操作系统(基本都是Linux系统)。 由于一个节点上,可能有多快CPU,每个CPU可能还是多核的,再加上加速卡,所以一般单节点都是一个具有多个核心的节点。
例如,目前(2019.09)排名 top500 第一的超算 summit,每个节点的结构如下图所示。其每个节点有一个 Power9 CPU,外加3块 NVIDIA V100 GPU。节点内部的 CPU-GPU 以及 GPU-GPU之间通过 NVIDIA NVLink 互联起来。
summit link

文件系统

一般地,超算上不是每个节点都有一块硬盘的,而是用的各个节点共享的并行文件系统,使用并行文件系统,各个节点都可以向这个共享的文件系统中写入或读取文件。

计算能力的衡量指标: FLOPS

FLOPS,或者叫 Flops、flops 或 flop/s,即 floating point operations per second, 指的是计算机系统每秒可以进行的浮点数操作次数, 具体可参见 wikipedia-FLOPS。 除了FLOPS作为单位外,还有 GFlops,TFlops,EFlops,ZFlops等单位,其中:

  • 1 KFlops = 1000 Flops
  • 1 MFlops = 1000 KFlops
  • 1 GFlops = 1000 MFlops
  • 1 TFlops = 1000 GFlops
  • 1 PFlops = 1000 TFlops
  • 1 EFlops = 1000 PFlops
  • 1 ZFlops = 1000 EFlops

例如目前,无锡神威太湖之光超级计算机,其持续浮点性能为 93.0146 PFlops,9.3亿亿次/秒 (在 top500 网站上列出的超级计算机性能表里面,会提到系统的峰值性能(Rpeak)和持续性能(Rmax))。