タグ

c*に関するsh19910711のブックマーク (549)

  • FMA (fused multiply-add) の話 - Qiita

    この記事では融合積和 (fused multiply-add; 以下もっぱら FMA) について扱います。 この記事は元々「その辺で提供されている fma 関数の実装が正しいかチェックしてみた」記事だったのがだんだん守備範囲を広げていったものなので、FMAを単に使うだけではなく、実装する側の視点が多く含まれています。 筆者が実装したHaskell向けのFMA関数はこちらにあります: haskell-floating-point/FMA.hs at master · minoki/haskell-floating-point FMAとは、FMAを含む規格 融合積和(fused multiply-add; FMA)とは、積と和が合体した演算です。数式で書けば $xy+z$ です。この際、丸め(浮動小数点数で正確に表せない数をそれに近い浮動小数点数で代用すること)を1回しか行わないため、「積→和

    FMA (fused multiply-add) の話 - Qiita
    sh19910711
    sh19910711 2024/10/13
    "FMA: 積と和が合体した演算 + 数式で書けばxy+z / 丸め(浮動小数点数で正確に表せない数をそれに近い浮動小数点数で代用すること)を1回しか行わないため、「積→和」の2回に分けて演算するよりも精度が向上" '20
  • C++で(One-shot) Algebraic Effectsで自動微分をする

    はじめに Algebraic Effects (and Handlers)は大雑把に言うと「もとの場所に戻れる例外」で、戻らなくても良いし、また戻った後に何か動作させることもできるし、(multi-shotであれば)複数回もとの場所に戻ることもできます。 例の如くDan Abramov氏の記事 の記法を使うと // (1回)戻る場合 try { makeFriends(arya, gendry); } handle (effect) { if (effect === 'ask_name') { resume with 'Arya Stark'; } } // 戻らない、つまり普通の例外と同じ try { makeFriends(arya, gendry); } handle (effect) { if (effect === 'ask_name') { console.error('ERR

    C++で(One-shot) Algebraic Effectsで自動微分をする
    sh19910711
    sh19910711 2024/10/11
    "大雑把に言うと「もとの場所に戻れる例外」で、戻らなくても良いし、また戻った後に何か動作させることもできる / 非同期プログラミング、パーサー、自動微分、確率的プログラミングなどの応用" '23
  • 自作Cコンパイラ 8時間の奮闘

    2024-09-07 セキュリティキャンプ アフターイベント 2024-09-14 traP & Zli 合同LT で発表したスライドになります。

    自作Cコンパイラ 8時間の奮闘
    sh19910711
    sh19910711 2024/09/15
    "10ccのソースコードの一部を10cc(第1世代)でコンパイルし、残りをGCCでコンパイルして、どのファイルがバグの原因なのかを探ります / 10ccとGCCの出力するアセンブラが互換性を持つようにしないといけません"
  • 自作Cコンパイラでセルフホスティングを達成した

    低レイヤを知りたい人のためのCコンパイラ作成入門(以降「低レイヤ」)を参考にして作り始めたCコンパイラがようやくセルフホスティングできるようになったので、 今までの経験をメモしておく。 リポジトリはこちら:https://github.com/tyfkda/xcc 動機XV6という学習用OSをひとまず使えるものにしたいなぁと思っていて、Cコンパイラが動けばXV6上で開発できるようになるのでぜひとも動かしたいと思っていた。 しかし既存のソースだとCからアセンブリを出力するだけで、アセンブラやリンカはgccを使うとかしていることが多くて、そのままだと動かすのが難しいのではないかと思っていた。 「低レイヤ」もその方式なんだけど、それを直接バイナリを出力する方法で実装したらできるのではないかと、始めてみた。 進め方「低レイヤ」では最初に整数1個をコンパイルできるだけというミニマルな状態から始めて、

    sh19910711
    sh19910711 2024/08/28
    "整数1個をコンパイルできるだけというミニマルな状態から始めて、徐々に拡張" '19
  • 書評:『自然言語処理と深層学習《C言語によるシミュレーション》』 | Webシステム開発/教育ソリューションのタイムインターメディア

    題名:自然言語処理と深層学習 《C言語によるシミュレーション》 小高 知宏 著 A5、224項、体2500円 平成29年3月25日 発行 オーム社 ISBN 978-4-274-22033-3 深層学習(Deep Learning)のブームが続いているが、多くの場合は画像系が話題の中心になっている。 深層学習は、何も画像処理だけでなく、自然言語処理にも使える、他にも、たぶん色々なことに使えるであろう。 ということで、少々画像関連ばかりをやるのに飽きてきたというのもあって、自然言語処理のを取り上げることにした。 書の最大の特徴は、C言語を使って実装されているということだ。 深層学習というと、今は圧倒的にPythonが多い。それも、多くはフレームワークを使っていて、深層学習がどのように実装されているのとかは全く分からないけれど、とりあえず動かすことができ、何かAI的な動きになっているのを

    書評:『自然言語処理と深層学習《C言語によるシミュレーション》』 | Webシステム開発/教育ソリューションのタイムインターメディア
    sh19910711
    sh19910711 2024/06/21
    "畳み込みニューラルネットワーク(CNN)とリカーレントニューラルネットワーク(RNN)が、それぞれ1つの章として書かれている / 扱っている内容は基本的なことだけであるが、実行結果やその説明はかなり丁寧" 2017
  • bisonとflexで自作パーサーを作る

    前回の続編 前回は、再帰下降法を用いてC言語の数式パーサーを作りました。 再帰下降法でC言語数式パーサーもどきを作ってみる 今回は、bisonとflexを用いて同様のパーサーを作成します。再帰下降法と異なり簡単に字句解析・構文解析が行えるのが特徴です。 ソース一式 今回作成したソースはGistに載せておきます。 flex(The Fast Lexical Analyzer) flexとはlexの上位互換版になります。lexは字句解析ルーチンを生成します。flexはlexよりも少ない時間でテーブルを生成できつつ、効率の良いテーブルとなっています。 bison bisonとはyaccの上位互換版です。bisonは文脈自由文法の仕様を入力として、その文法を解析するためのC言語の関数を生成します。ここではC言語を用いているためC言語関数を生成しますが、Pythonなどのbisonを使用すればPyt

    bisonとflexで自作パーサーを作る
    sh19910711
    sh19910711 2024/06/19
    "flex: lexの上位互換版 + 字句解析ルーチンを生成 / bison: 文脈自由文法の仕様を入力として、その文法を解析するためのC言語の関数を生成 / flexとbisonを用いることで、自己流の定義ファイルや言語解釈をしてくれる" 2020
  • C言語のソースコードをZigに変換する機能を試す(その1)

    zigのツールにCのソースコードをZigに変換する機能(zig translate-c)があるので、それを試してみました。 予想外に苦労したので、その1の記事はhello.c をhello.zigに変換してビルドして動作確認まで。 まずはHello, world!

    C言語のソースコードをZigに変換する機能を試す(その1)
    sh19910711
    sh19910711 2024/06/19
    "zig translate-c: CのソースコードをZigに変換する機能 / 明示的にインクルードファイルのディレクトリを指定する必要がある / main()の戻り値の型はZigの仕様に従うように修正 (c_int -> u8)" 2022
  • pybind11 で Eigen/Geometry を呼び出してロール・ピッチ・ヨー角と回転行列を計算する。 - Qiita

    pybind11 で Eigen/Geometry を呼び出してロール・ピッチ・ヨー角と回転行列を計算する。CMakenumpyEigenpybind11 pybind11 では numpy の行列と Eigen の行列を相互参照してくれます。numpy には3次元幾何用の関数が不足しているので、C++ の Eigen/Geometry を呼び出して、ロール・ピッチ・ヨー角と回転行列を計算するモジュールを作成しました。pybind11 の使い方の例として記事にしておきます。 環境 CMake がインストールされ、コマンドラインから cmake が起動できること。 pybind11 がインストールされ、環境変数 pybind11_DIR の設定等によって、find_package(pybind11) が成功すること。 Eigen がインストールされ、環境変数 Eigen3_DIR の設定等に

    pybind11 で Eigen/Geometry を呼び出してロール・ピッチ・ヨー角と回転行列を計算する。 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "pybind11 では numpy の行列と Eigen の行列を相互参照 / numpy には3次元幾何用の関数が不足しているので、C++ の Eigen/Geometry を呼び出して、ロール・ピッチ・ヨー角と回転行列を計算する"
  • リンク前に不必要なシンボルを削除する - Qiita

    int do_things(void); int application_main(void) { return do_things(); } int test_main(void) { return 42; } int main(void) { return test_main(); } 元の問題は、application_mainとtest_mainを(おそらくはプリプロセッサで)切り替えたいのですが、ライブラリに関数do_thingsが実装されていないためリンクが失敗します。 /tmp/demo-d19626.o: 関数 `application_main' 内: demo.c:(.text+0x5): `do_things' に対する定義されていない参照です clang-6.0: error: linker command failed with exit code 1 (use

    リンク前に不必要なシンボルを削除する - Qiita
    sh19910711
    sh19910711 2024/06/18
    "application_mainとtest_mainを(おそらくはプリプロセッサで)切り替えたい / ライブラリに関数do_thingsが実装されていないためリンクが失敗 / このdo_thingsをリンク前に除けるかという問題" 2018
  • [LLVM超入門] [C++] LLVMを利用してLLVM IRを生成してみる - Qiita

    First みなさんこんにちは。あきっちです。 いきなりですがLLVM、知っていますか?もちろんみなさんならご存じですよね。 そうです。コンパイラ基盤です。 最近のプログラミング言語ではよく採用されているようで、とっても優秀らしいです。 私たちも流れに乗ってやってみましょう!! 前提条件など C++が多少かける CMakeのやり方がわかる includeディレクトリが適切に設定できる リンクエラーしてもめげない心 筆者の環境 Windows 10 Home i7 7700HQ RAM 16GB Visual Studio 2019 Community 環境構築など この方が書いてくださっている LLVMに実行可能コードの生成をまかせたいがとってもわかりやすいです。 LLVMには中間表現(IR)があり、任意のフロントエンドがIRにすることであとはLLVMに実行ファイルの生成と最適化を任せるこ

    [LLVM超入門] [C++] LLVMを利用してLLVM IRを生成してみる - Qiita
    sh19910711
    sh19910711 2024/06/18
    "LLVMには中間表現(IR)があり、任意のフロントエンドがIRにすることであとはLLVMに実行ファイルの生成と最適化を任せることが出来ます / IRで数値を扱うには: Valueというそれっぽいもの + これを使って数値を作ります" 2019
  • clangでコールグラフを出力 - Qiita

    https://stackoverflow.com/questions/5373714/how-to-generate-a-calling-graph-for-c-code/5373814#5373814 ここの記載を参考にやってみた、というお話です。 やってみた、調べた、をメモがてら残そうと思った記事なので、話の裏どりはあまりしていません。 検証環境 MacOS11.1 clang++(homebrew) 11.0.0 homebrewで必要なツールをインストール macにプリインストールされているllvmではoptコマンドが入っていないので、homebrewを使ってインストールしました。 dotファイルのプレビュー用にgraphvizというソフトをインストールしました。 記事を参考に実行 dotファイルの作成 下記のコマンドを実行することで、main_cpp.callgraph.dot

    clangでコールグラフを出力 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "macにプリインストールされているllvmではoptコマンドが入っていないので、homebrewを使ってインストール / opt自体はllvmの各パスを調査するためのツール / -dot-callgraph: dot形式でグラフを出力" 2020
  • 列挙型(enum)の値と識別子を出力する技 - Qiita

    enumの値と識別子を出力したい場合に面倒になるのが、値から識別子へ文字列変換です。 識別子と、識別子の文字列リテラルの両方を書く必要がある(同じことを2回書く面倒) if文やcase文で同じ判定を存在する識別子分かかないといけない(似たことたくさん書く面倒) 上の2つを識別子が増えるたびに繰り返すことになる(面倒が続く) CやC++のPreprocessorのマクロには引数を文字列リテラルに変換する機能があり、これを使うとコーディングが楽になります。今回はenum値の出力に応用していますが、コツをつかむといろいろ応用が効きます。 マクロなのでCでもC++でも使える 識別子を1回書くだけでよい ifやcaseの繰り返しもマクロで置換する 識別子を増やしても軽微な修正で済む ソースコード(マクロなし) 正攻法でちゃんと書いた例。記述量が多くなり、また、変更が入ったときにはメンテも大変そうです

    列挙型(enum)の値と識別子を出力する技 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "enumの値と識別子を出力したい場合に面倒になるのが、値から識別子へ文字列変換 / if文やcase文で同じ判定を存在する識別子分かかないといけない(似たことたくさん書く面倒) + 識別子が増えるたびに繰り返すことに" 2022
  • 【Clang/LLVM】CFGの生成 - Qiita

    はじめに きつねさんのを用いてLLVMの勉強を始めたところ、LLVMのVersion違いのために、CFGの生成に失敗してしまいました。同じ問題に直面する方がいるかと思いましたので、この記事では、LLVMのVersion 14.0.6(2022年8月時点の最新)で確認したCFGの生成方法を紹介します。尚、今回生成するCFGは単純な分岐処理を行うプログラムを対象としたもので、最終的に以下のように表示されます。 対象読者 LLVMに関する学習を開始した方 目標 CFGの生成ができるようになること 目次 LLVMとは 環境構築 CFGの生成 まとめ 文 1. LLVMとは 1.1 概要 LLVMは、プログラミング言語開発における主にミドルエンドとバックエンドの処理に必要な機能(コンパイル時、リンク時、実行時の最適化などの複雑な処理に関する機能)をAPIとして提供することで、プログラミング言語の

    【Clang/LLVM】CFGの生成 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "LLVMを用いたプログラミング言語開発では、ミドルエンドが抽象化されているために、複数のフロントエンド、複数のバックエンドに対応 / CFG: プログラムの制御フローを可視化したもの" 2022
  • LLVMのstd:: uniform_real_distributionが遅い件 - Qiita

    発端 一年ほど前の@kaityo256さんの発言: うーん、A64fx、やっぱりモンテカルロは苦手っぽいなぁ。 — ロボ太 (@kaityo256) February 4, 2022 MT19937がコンパイル条件によっては極端に遅いという話だったが、調べようと思ったまま1年近くが経ってしまった。別件で調べていてわかったのは、 遅いのはstd::mt19937ではなくstd:: uniform_real_distributionの方(まぁモンテカルロやるなら確実に踏む) LLVMとlibstdc++のときにAarch64であれx86_64であれ発動する、libc++にすることで回避できる ということ。libstdc++とlibc++については を参照してください。 計測 とりあえずこんなソース: #include <iostream> #include <iomanip> #include

    LLVMのstd:: uniform_real_distributionが遅い件 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "MT19937がコンパイル条件によっては極端に遅いという話 / 遅いのはstd::mt19937ではなくstd:: uniform_real_distributionの方 / LLVMとlibstdc++のときにAarch64であれx86_64であれ発動" 2023
  • LLVMのstd::uniform_real_distributionが遅い件のLLVM観点の原因を探ってみた - Qiita

    はじめに 興味があったので以下の件についてLLVMの観点で原因を探ってみました。 以下、デバッグビルドしたLLVM15.0.7を使ってみていきます。 "std::uniform_real_distributionが遅い件"で問題とされた部分 const long double __r = static_cast<long double>(__urng.max()) - static_cast<long double>(__urng.min()) + 1.0L; const size_t __log2r = std::log(__r) / std::log(2.0L); このままでは、コンパイル出来ないので整形します。上記コード中の__urng.max()と__urng.min()は、たどるとそれぞれstd::numeric_limitsのmax()とmin()となっているので、そのように置

    LLVMのstd::uniform_real_distributionが遅い件のLLVM観点の原因を探ってみた - Qiita
    sh19910711
    sh19910711 2024/06/18
    "-mllvm -print-before-all -mllvm -print-after-all: これらのオプションをつけてコンパイルすると以下のような最適化処理の前後のLLVM IRのログを見ることが出来ます / 引数をdouble型にキャストしたコードについて見ていき" 2023
  • LLVM C API を使う. - Qiita

    LLVM には C++ と C API が用意されています. 最近は FTL http://blog.llvm.org/2014/07/ftl-webkits-llvm-based-jit.html のおかげで C API の整備が大分進み, 十分使える感じになっています. C API のほうがコンパイル時間も短くて済み, また言語バインディングを書くとなども, リンケージや ABI 問題に悩まされなくなります. これからは C API で書いておきたいですね. LLVM C API のサンプル ひとつの大きな問題はドキュメントやサンプルコードがオフィシャルには無い事です. 幸い FTL(webkit) には RefucedFTL という謎(?)の LLVM C API を使ったサンプルがあります. これをみれば大体わかりますね! 昨今の LLVM では MCJIT が推奨のようです. E

    LLVM C API を使う. - Qiita
    sh19910711
    sh19910711 2024/06/18
    "LLVM: FTLのおかげで C API の整備が大分進み, 十分使える感じに / ひとつの大きな問題はドキュメントやサンプルコードがオフィシャルには無い事です / MCJIT を使い, LLVMLinkInMCJIT() を忘れずに呼び出しておきましょう" 2014
  • 競プロ用の環境構築覚書 C++&VSCode(&WSL2) - Qiita

    はじめに やると快適になるけれど、何かと面倒な環境構築。 私は環境構築への苦手意識が強くあったのですが、3回くらいやって少しは慣れた気がするので今のうちにメモをしておきます。 もし記事内容に明らかな誤りがあれば、コメント等でご指摘いただけると幸いです。 当記事ではC++201の導入、AtCoder Libraryの導入、<bits/stdc++.h>ヘッダのプリコンパイル、コンパイルと実行のコマンド(ShellScript)を取り扱います。 Linuxについての知識が一切ない人でも大丈夫だと思います。 なお、想定環境としてはWindows11+WSL2VSCodeを利用する形ですが、Windows10でも概ね同様だと思います。 LinuxユーザでもWSL関連以外の内容は共通しています。MacOSはわかりかねます… 最終的にはこのようなディレクトリ2構成になります。ac-libraryディ

    競プロ用の環境構築覚書 C++&VSCode(&WSL2) - Qiita
    sh19910711
    sh19910711 2024/06/17
    "C++20の導入、AtCoder Libraryの導入、<bits/stdc++.h>ヘッダのプリコンパイル / ヘッダファイルのプリコンパイルをしておくと、一回のコンパイル時間を短縮 / できる限りコンパイル時間は短縮しておきたい"
  • Cpputestの導入 - Qiita

    背景 Pythonでの単体テストのやり方が書いてあるテスト駆動Pythonを読んで、実際の業務で実践していました。 その効果を話していたところ、組み込み開発チームでも導入していきたいということだったので、組み込み開発でテスト駆動開発を行うテスト駆動開発による組み込みプログラミングを参考にしながら、Cpputestを導入しました。 その際の導入手順をここにまとめます。 目的 実機がなくても開発したコードの動作が検証可能な環境を構築する ホスト(PC)での単体テスト実行環境を構築 ターゲット(組み込みLinux基板)での単体テスト実行は未実施 環境 OS: Debian GNU/Linux 9 on WSL テストフレームワーク: Cpputest 3.8 インストール手順 Cpputestをダウンロード 後にCPPUTEST_HOMEという環境変数にCpputestをビルドしたディレクトリに

    Cpputestの導入 - Qiita
    sh19910711
    sh19910711 2024/06/16
    "組み込み開発でテスト駆動開発を行うテスト駆動開発による組み込みプログラミングを参考にしながら、Cpputestを導入 / 実機がなくても開発したコードの動作が検証可能な環境を構築する" 2019
  • CMakeプロジェクトにgoogletestを導入した話 - Qiita

    はじめに CMakeで構成されたC++プロジェクトに、googletestによるユニットテストを組み込む方法です。 公式で説明されている方法の一つ("Incorporating Into An Existing CMake Project")を改めて解説し直すだけですが、C++もCMakeも知らないエンジニアが、なぜかマネージャーとしてC++プロジェクトをレビューせざるを得なくなった場合に、せめてテスト環境だけでも整えるため、最小限の手順でユニットテストに対応するための覚書として残しておきます。 この方法のメリット OSが持つgoogletestライブラリに依存しないので、 (yumやaptのための)管理者権限が不要です。 誰が、どこで(どのOSで)実行しても、安定した結果が得られます。 ビルドの実行ごとにgoogletestのソースコードをcloneするので、 最新のgooglete

    CMakeプロジェクトにgoogletestを導入した話 - Qiita
    sh19910711
    sh19910711 2024/06/16
    "CMakeで構成されたC++のプロジェクトに、googletestによるユニットテストを組み込む / enable_testing: ctestでテストを実行する場合にはadd_test()と合わせて宣言 / Makefileにtestというルールを追加する機能もある" 2020
  • 【C++】Clangでテストコードがないコードも対象に含めテストカバレッジを計測する方法 - Qiita

    記事では、C++においてコンパイラーとしてClangを使用している際に、テストコードがないコードも対象に含めテストカバレッジを算出する方法をまとめています。 記事内で使用している環境は以下のとおりです。 OS: Debian 12.5 ビルドシステム: CMake 3.25.1 コンパイラー: Clang 14.0.6 ビルドツールとして上記のとおりCMakeを使っていますが、CMakeを使わない場合も記事の内容に準ずる設定をすれば実現できると思います。 OSについてはLinuxを対象にしているため、Windowsに適用できるかどうかはわかりません。 登場するファイル・コマンド ファイル gcno: コードのプロファイルデータ gcda: カバレッジデータ コマンド make, cmake: コンパイル型言語向けビルドツール clang: LLVMをバックエンドとしたC/C++コンパ

    【C++】Clangでテストコードがないコードも対象に含めテストカバレッジを計測する方法 - Qiita
    sh19910711
    sh19910711 2024/06/16
    "Clangを使用している際に、テストコードがないコードも対象に含めテストカバレッジを算出する / clangのコンパイルおよびリンカーオプションに--coverageを追加 / lcov: gcovによるカバレッジの計測結果を視覚的に表示"