このブラウザ バージョンのサポートは終了しました。サポートされているブラウザにアップグレードしてください。
この記事はTensorFlow Advent Calendar 2020、17日目の記事です。この記事ではLLVMコミュニティが中心となって開発しているMLIRという新しいコンパイラ基盤の基本的な使い方を解説します。 MLIRとはMLIRとはコンパイラ基盤となるオープンソースのソフトウェアでその名はMulti-Level Intermediate Representationの頭文字を取ったものです。もともとはGoogleのTensorFlowチームが開発したソフトウェアでLLVM Foundationに2019年に寄贈されました。 コンパイラ基盤としてはLLVMがよく知られていますが、MLIRはLLVMで得られた知見をより抽象的なレベルで実現し、機械学習アプリケーションに代表されるような複雑な数値計算を様々なハードウェア上に最適な形で実行できるようにします。 例えばコンパイラが真に必要な
はじめに 半導体の微細化が鈍化し、ハードウェアによる高速化が困難になっている現状において、ソフトウェアによる計算の高速化が喫緊の課題となっています。この状況において、特定のドメインの問題を解くことに最適化された言語であるドメイン固有言語と、そのコンパイラであるドメイン固有コンパイラの活用が望まれています。 ドメイン固有コンパイラの構築の際には、開発を容易にするために、既存のコンパイラ基盤であるLLVMを活用することが考えられます。しかし、LLVM はドメイン固有コンパイラの構築にはあまり向きません。この理由は、LLVM の成功と表裏一体の関係にあります。 LLVM が成功した理由は、コンパイラの処理を適切に分割し、独立したモジュールとして機能させたことにあります。このモジュール化において中心的な役割を果たしているのが、LLVM で用いられる中間表現(Intermediate Represe
「作って学ぶコンピュータアーキテクチャ」(いわゆるRISC-V + LLVM本)は書籍執筆時の状況と出版時のツールチェインの状況がかなり変わってしまっており、各所で迷惑をかけてしまっています。 確実にLLVMビルド + シミュレーションを行うために、ツールチェインを含んだDockerイメージをリリースします。 github.com 大きく分けて4つのイメージを用意しています。 ubuntu_2204 Ubuntu 22.04の環境を使用し、新しいRISC-Vツールを使用したDocker環境です 本書で説明している実行コマンド列と大きく異なっている場所があります LLVMリポジトリはコンテナ内にダウンロード済みです(コンテナ容量削減のためビルドは行っていません) 最終的なバイナリのみ必要な方向けです ubuntu_2204_onlyenv Ubuntu 22.04の環境を使用し、新しいRIS
概要 dereferenceable_globally NonZeroUXXのLower 空無限ループ 終わりに 概要 この記事はRust Advent Calendar 2019の12日目の記事として書かれました。 qiita.com 遅刻してしまった...すいません(最悪)。 言わずもがなRustはLLVMをバックエンドに持つ言語です。 なのでバグがLLVMの最適化のせいだったりします。有名な例はnoaliasとか無限ループとかです。この辺りは定期的(2ヶ月一回くらい?)にTwitterとかで話題になりますね。またRustでの強い制約がLLVMにおける意味とのギャップで弱く表現せざるを得なかったりもします。そんな感じのこと少しだけ掘り下げて、RustのIssueとかLLVMのPhabricatorから幾つかまとめてみます。怪しいこと言ってたら教えて下さい。 dereferenceabl
対象読者 LLVMを勉強し始めたけど何からして良いのかわからない方 アセンブリがちょっとわかる 目標 LLVMの基本的な文法がわかるようになる 環境 Mac Mojave 10.14.6 LLVM 8.0.0 clang 8.0.0 (trunk 348837) LLVMってなに...? LLVMは一言で言えば、プログラミング言語を作成する為の基盤です。プログラミング言語はコンパイラによってバイナリに変換され実行することができます。それを言い換えれば、自分が考えたプログラミング言語のコンパイラを作ることで自作プログラミング言語を作れます。 そして、コンパイラは通常フロントエンド、ミドルエンド、バックエンドに分けられ、各プロセスで様々な処理をしています。特にミドルエンド、バックエンドでは中間言語や各アーキテクチャに対するたくさんの最適化を施さなければなりません。この最適化を預けてフロントエン
本記事は、WWDC2019のセッションである ‘LLDB: Beyond “po”’ を日本語にまとめたものです。 はじめにLLDBはXcodeのデフォルトデバッガで、変数の閲覧を可能にします。左下のパネルで利用している変数とその型が確認できます。デバッグ中、右下のコンソールパネルからLLDBに直接コマンドを叩くこともできます。 poコマンドLLLDBでもっとも使われるコマンドはおそらくpoでしょう。poは一つの変数を出力するコマンドです。 CustomDebugStringConvertibleを継承させることによって、アウトプットの形式をカスタマイズすることができます。debugDescriptionプロパティを実装すると、アウトプットの一番上のdescriptionが書き換わります。それより下の階層を書き換えたい場合には、CustomReflectableを継承します。 さて、poが
セルフホスト(自分自身をビルド)できるCコンパイラnoccを書きました。 github.com はじめに 去年の夏あたりからCコンパイラを書くのが流行っていたのでやってみました。 例によって@rui314さんの8cc、9ccと低レイヤを知りたい人のためのCコンパイラ作成入門を参考にしていますが、バックエンドにはLLVMを使用しています。 工夫した点 以下、作る上で工夫した点です。 言語仕様に制限をつける C言語の全仕様を網羅しようとすると到底完成は不可能なのでサポートする言語仕様に制限をつけまくりました。 制限には例えば以下のようなものがあります。 変数宣言が初期値を取れない。 複数の変数をコンマ区切りで宣言できない。 typedef宣言や型のconst修飾などはその語順を固定している。 型解析時は型のconst修飾を無視する。 関数のプロトタイプ宣言はトップレベルでのみ行える。 関数ポイ
ClangSharpPInvokeGeneratorって? Microsoftの.Net用ClangバインディングMicrosoft/ClangSharpの サンプル 兼 libclang.dllのP/Invokeのコードの自動生成用のプログラムです。 ClangSharpPInvokeGeneratorはlibclang.dllだけでなく、 一般のネイティブDLL呼び出しのためのP/Invokeのコードの生成もできそうなのですが、 ググっても日本語の情報が出てこなかったので試しに使ってみました。 準備 LLVMのセットアップ LLVM Download Pageから Pre-Built Binaries: Clang for Windows (64-bit)を ダウンロード & 展開 & パスを通す .Net Coreのセットアップ ※ 現時点での最新版は2.1 .NET Core 2.
+------------------+ includes | | JIT +------------+ +--------------+ | C++ app | <--+- | C++ code |<---| STL header | | | | +------------+ +--------------+ +------------------+ | | C header | | libClang | | +--------------+ +------------------+ | | | libLLVM(MCJIT) | | | +------------------+ | | | STL/libc runtime |----+--------------------------+ +------------------+ link 問題点 (既存のを含め) C++ コードをその
LLVMを使った自作言語に例外を入れることを考えてた。結論からいうとCrystalのソースを真似するのでよさそう。 Crystal → libunwind → _Unwind_RaiseException C++ → __cxa_throw → libunwind → _Unwind_RaiseException _Unwind_RaiseException等の仕様はここ。http://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html 「Itanium C++ ABI」という名前ではあるけれど、Level I, II, IIIのうちのLevel I部分(_Unwind_RaiseException等)はC++に限らない言語独立なAPIになっている。__cxa_throwはLevel IIで、C++用のもの(であるけれど、場合によってはこれが使えるこ
LLVM is a robust system, particularly well suited for developing new mid-level language-independent analyses and optimizations. LLVMがC++標準ライブラリとして新しくlibc++を含むようになった。LLVMはこれまでC++標準ライブラリとしてGCC/G++のlibstdc++を採用してきた。libc++はこれを置き換えることになるもので、BSDライセンスのもとで提供されている。libc++の特徴は次のとおり。 C++0Xをターゲットにして実装が進められている 高速コンパイル 高速実行 省メモリ libstdc++とのABI互換性あり 開発段階にありN3092実装の85%ほどを達成 BSDライセンスでの提供 GCC/G++ libstdc++ではなく新しくlib
fossBytesに6月14日(米国時間)に掲載された記事「Microsoft Open Sources "Checked C" — An Extended Version Of C To Avoid Coding Errors」が、Microsoftにより開発が進められている「Checked C」と呼ばれる技術について伝えた。「Checked C」はC言語を拡張する機能で、より安全なコーディングが可能になるとされている。 Microsoftのソフトウェアの多くはC/C++で開発されている。C言語はポインタの扱いを間違えると本来アクセスしてはいけないメモリを指した操作をしてしまうことがあり、これがバグや脆弱性の原因の1つになっている。「Checked C」はこうした問題を回避することを目指してC言語の機能を拡張するもので、ポインタに対してあらかじめ範囲情報を持たせておき、ポインタの指し示す
最近の投稿 問題: 積み木を10個積み上げるのにかかる時間は 2020/8/20 木曜日 Google の G Suit Team から “[Action Required] Remove internal links to the G Suite Domain Contact page for your organization” ていうメールが来た 2020/8/14 金曜日 NZXT H1 と ROG STRIX B550-I GAMING で組んでみた 2020/7/17 金曜日 花粉症対策2019 2019/3/16 土曜日 マルチディスプレイ時のDisplayPort問題を何とかしてみた 2019/1/12 土曜日 REALFORCEソフトウェアがインストールできない(解決済) 2018/12/6 木曜日 GeForce RTX 2080 Founders Edition を買
こちらからの続きです。 LLVM bitcode基礎知識 http://qiita.com/gamako/items/f37dbb05de9d3832ce6b Xcode7からデフォルトで有効になったembed-bitcodeオプションがどんな働きをしているか見てみましょう。 ふつうのoファイル まず前回と同じHelloWorldのソースコードから、ふつうにoファイルを出力してみます。 % hexdump -C -v sample.o 00000000 cf fa ed fe 07 00 00 01 03 00 00 00 01 00 00 00 |................| 00000010 04 00 00 00 00 02 00 00 00 20 00 00 00 00 00 00 |......... ......| 00000020 19 00 00 00 88 01 0
iOS9からのアプリ最適化の仕組みAppThinningのため、Xcode7 betaからはアプリへのbitcodeの埋め込みがデフォルトで有効になりました。 https://developer.apple.com/library/prerelease/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html http://qiita.com/usagimaru/items/cb19f283db4ac0cd8bd6 bitcodeとは何かを感じ取るためのエントリです。 続き Xcode7でのembed-bitcodeオプション http://qiita.com/gamako/items/4ebfd048c5aed4f68595 bitcodeとは LLVMのビルドフローは、ざっくり
(注:2017/07/06、いただいたフィードバックを元に翻訳を修正いたしました。) この記事は、 LLVM コンパイラ基盤を使ってリサーチをする人のための入門書です。これを読めば、コンパイラに全く興味のない大学院生も、楽しみながらLLVMを使って優れた功績をあげられるようになるでしょう。 LLVMとは何か? LLVMは非常に優れていて、ハックしやすく、C言語やC++のような”ネイティブ”言語向けの、時代の先端を行くコンパイラです。 LLVMの素晴らしさに関しては他にも様々な話を聞くのではないでしょうか(JITコンパイラとしても使えるとか、C言語系列以外の様々な言語を強化できるとか、 App Storeからの新しい配信形態 であるとか、などなど)。もちろん全部本当のことですが、今回の記事の目的としては、上述の定義が重要です。 LLVMが他のコンパイラと差別化される理由には、いくつかの大きな
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く