原创 GCC編譯選項含義解析

GCC 編譯 GCC的編譯流程分爲四個步驟,分別爲: 預處理(Pre-Processing) 可以通過gcc -E hello.cc -o hello.i查看中間結果 編譯(Compiling) 彙編(Assembling) 鏈接(

原创 如何加速C++文件的編譯速度?

一、爲什麼慢? 重要的一個原因是C++的基本 頭文件-源文件的編譯模型: 每個源文件爲一個編譯單元 頭文件數量多,可能會包含上百甚至上千個頭文件 存在重複解析,每個編譯單元中,這些頭文件都要從硬盤裏讀取然後被解析 每個編譯單元都會

原创 源碼研習 — TVM中的IR設計與技術實現

一、關鍵問題 TVM中的 IR 是什麼,架構設計上分幾層? 解答:TVM的整體結構圖如下: 概念上,分爲兩層:上層爲面向前端組網的Relay IR, 下層爲面向LLVM的底層 IR。 但從設計實現上,底層通過 Object 元類實現統一的

原创 技術書籍 — EffectiveMordenCpp 研讀

一、類型推導 PROs: 源碼某處的類型修改,可以自動傳播其他地方 Cons: 會讓代碼更復雜(How?) 在模板類型推導時,有引用的實參會被視爲無引用,他們的引用會被忽略 template<typename T> void f

原创 Google C++ 語言規範

1. 命名空間 KeyNotes: 鼓勵在.cc文件裏使用匿名命名空間或者sttic聲明 禁止使用內聯命令空間,X::Y::foo 等價與X::foo。其主要用於跨版本的ABI兼容問題 namespace X{ inline nam

原创 淺析 TensorFlow Runtime 技術

關於 TF Runtime 的疑問? 什麼是TFRT ? TensorFlow Runtime,簡稱 TFRT,它提供了統一的、可擴展的基礎架構層,可以極致地發揮CPU多線程性能,支持全異步編程(無鎖隊列+異步化語義)。TFRT 可以減少開

原创 Linux — 進程管理

進程創建 進程通過fork()創建的大致過程: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> extern int cr

原创 Paddle源碼之內存管理技術

前言 在深度學習模型訓練中,每次迭代過程中都涉及到Tensor的創建和銷燬,伴隨着的是內存的頻繁 malloc和free操作,可能對模型訓練帶來不必要的 overhead。 在主流的深度學習框架中,會藉助 chunk 機制的內存池管理技術來

原创 編譯原理—寄存器和指令入門

指令樣例 mov (%edx), %eax // 將內存地址爲 EDX 的數據放入到 EAX 寄存器中 XCHG %edi %eax // 交換 EAX 和 EDI 寄存器的值 add %ebx, %eax // 將 EAX 和

原创 CMake快速入門教程

前言 Make工具因遵循不同的規範和標準,執行的Makefile的格式也是不同。主流的Make工具包括: GNU Make QT的qmake 微軟的 MS nmake BSD的 pmake 每個平臺都有自己的工具,則帶來了很大的平臺兼容

原创 Linux — 物理內存管理

物理內存的組織方式 物理內存是由連續的一頁一頁的塊組成,每個物理頁都有頁號 每個頁由struct page表示,放進數組裏——平坦內存模型 SMP和NUMA SMP中,總線會稱爲瓶頸,因爲數據都要經過它 NUMA中 每個CPU都有

原创 設計模式之美--單一職責原則

什麼是單一職責原則? 單一職責原則的英文是Single Responsibility Principle,簡稱SRP。其原始英文描述是: A class or module should have a single responsibi

原创 設計模式之美--開閉原則

什麼是開閉原則? 開閉原則的英文是Open Closed Principle,簡稱OCP,它的英文描述是: Software entities (modules, classes, functions, etc.) should be

原创 Git敏捷開發--reset和clean

reset 丟棄本地所有修改,強行和上游分支保持一致 git reset --hard HEAD 若僅丟棄某個文件的改動,利用checkout git checkout your_file clean 清除未跟蹤文件。reset和che

原创 Docker常用命令--ps/attach/run

ps查看container 若查看正在運行的container docker ps 查看所有的container docker ps -a run啓動容器 第一次啓動container docker run --name your_na