Skip to main content

3 posts tagged with "toolchain"

View All Tags

在 CUDA 环境下安装 HIP

· 9 min read

HIP (Heterogeneous-Compute Interface for Portability) 是 AMD 开发的一款异构计算的接口工具。 HIP 允许只用写一套代码(hip代码), 就可以将程序同时在 NVIDIA GPU 和 AMD GPU 及 DCU 上编译运行。

HIP is a C++ Runtime API and Kernel Language that allows developers to create portable applications for AMD and NVIDIA GPUs from single source code.

HIP 的 API 和 CUDA 的API十分类似,例如 CUDA 中内存拷贝用cuMemory, 在 hip 中用hipMemcpy,且参数也十分一致。 因此,会 CUDA 的开发者可以很轻松地转移到 hip 上。 并且,hip 还提供了hipfy 工具,将 CUDA 代码转换为 hip 代码。
HIP 在不降低性能的前提下,统一了CUDA API 和AMD GPU 编程API,可谓极大地降低了各个平台的适配与移植工作, 做到了一套代码,在多个异构平台上运行。 可以说, "舍弃 CUDA,进入HIP时代"。

那么,在 NV GPU下,如何安装并使用 hip 呢?

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).