国产化龙芯mips下编译安装ClickHouse

基础环境

Linux ningmei-PC 4.19.0-loongson-3-desktop #1143 SMP PREEMPT Thu Mar 5 21:00:31 CST 2020 mips64 GNU/Linux
系统:USO 20
默认支持:gcc-8
Clickhouse 版本:ClickHouse 20.1.6.30

环境准备

sudo apt-get install git cmake python ninja-build
sudo apt-get install gcc-8 g++-8

// clone Clickhouse 代码
git clone --recursive  -b v20.1.6.30-stable
tar -zcvf clickhouse-src-v20.1.6.30-stable.tar.gz ClickHouse

源码修改

// dbms/src/Compression/LZ4_decompress_faster.cpp
// 参考 
// copyOverlap8Shuffle 函数添加 mips 支持, 209 行左右
#ifdef __mips__

inline void copyOverlap8Shuffle(UInt8 * op, const UInt8 *& match, const size_t offset)
{
    copyOverlap8(op, match, offset);
}

#endif


// copyOverlap16Shuffle 函数添加 mips 支持, 350 行左右
#ifdef __mips__

inline void copyOverlap16Shuffle(UInt8 * op, const UInt8 *& match, const size_t offset)
{
    copyOverlap16(op, match, offset);
}

#endif
// dbms/src/Core/Defines.h 假装支持
#if !defined(__x86_64__) && !defined(__aarch64__) && !defined(__PPC__)
修改为:
#if !defined(__x86_64__) && !defined(__aarch64__) && !defined(__PPC__) && !defined(__mips__)
// contrib/poco/Foundation/src/SHA3Engine.cpp 210 行添加
// 参考 

#define nrLanes 25

static void fromBytesToWords(UInt64 *stateAsWords,
                             const unsigned char *state) {
  unsigned int i, j;

  for (i = 0; i < nrLanes; i++) {
    stateAsWords[i] = 0;
    for (j = 0; j < (64 / 8); j++)
      stateAsWords[i] |= (UInt64)(state[i * (64 / 8) + j]) << (8 * j);
  }
}

static void fromWordsToBytes(unsigned char *state,
                             const UInt64 *stateAsWords) {
  unsigned int i, j;

  for (i = 0; i < nrLanes; i++)
    for (j = 0; j < (64 / 8); j++)
      state[i * (64 / 8) + j] =
          (unsigned char)((stateAsWords[i] >> (8 * j)) & 0xFF);
// ucontext 支持 mips
// 参考 

#if defined(__x86_64__) && !defined(__FreeBSD__) && !defined(__APPLE__) && !defined(__arm__)
改为
#if defined(__x86_64__) && !defined(__FreeBSD__) && !defined(__APPLE__) && !defined(__arm__) && !defined(__mips__)


// getCallerAddress 函数里面追加

#elif defined(__mips__)
    return reinterpret_cast(context.uc_mcontext.pc);

编译安装

mkdir build && cd build
CC=clang-8 CXX=clang++-8

// 执行 cmake
cmake .. \
-DGLIBC_COMPATIBILITY=NO \
-DUSE_CPUID=0 \
-DUSE_CPUINFO=0 \
-DBUILD_TESTING=NO \
-DENABLE_TESTS=NO \
-DENABLE_SSL=NO \
-DENABLE_NETSSL=NO \
-DENABLE_S3=NO \
-DENABLE_HDFS=NO \
-DENABLE_REDIS=YES \
-DENABLE_MYSQL=NO \
-DENABLE_MONGODB=NO \
-DENABLE_RDKAFKA=NO \
-DENABLE_ORC=NO \
-DENABLE_PARQUET=NO \
-DENABLE_PROTOBUF=NO \
-DENABLE_JEMALLOC=NO \
-DENABLE_READLINE=NO \
-DENABLE_FASTOPS=NO \
-DENABLE_POCO_MONGODB=NO \
-DENABLE_CLICKHOUSE_PERFORMANCE_TEST=NO \
-DUSE_UNWIND=NO \
-DNO_WERROR=1

// 编译
ninja

// 打包
cpack --config CPackConfig.cmake

编译选项说明

GLIBC_COMPATIBILITY
依赖高版本 glibc 的程序能在低版本 glibc 运行,目前不支持 mips
影响范围:兼容性,比如 CentOS7 上编译的ck不能在 CentOS6 上运行

USE_CPUID
获取 CPU 相关信息,ck 中使用它获取 cpu 的物理核数
影响范围:目前是在编译阶段获取到核数,兼容性,4 核设备编译出来的在8核上不能高效使用8核

BUILD_TESTING:
影响范围:不编译 CTest,不影响功能

ENABLE_TESTS:
不开启测试
影响范围:不启用 ck 的单元测试

ENABLE_SSL:
安全连接,目前不支持 mips
影响范围:不能启用 https 及 tcp 安全连接

S3、MYSQL、MONGODB、RDKAFKA、ORC、PARQUET
影响范围:不支持以上数据源的直接对接

USE_UNWIND:
异常时的堆栈优化展示
影响范围:抛出异常时堆栈不够人性化

性能上龙芯暂时没有 SIMD 相关指令,不能实现向量优化

0 个评论

要回复文章请先登录注册