餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

C/C++

新着順 人気順

Cの中でRを動かす

検索するとCからRを呼ぶコード例は色々とあるのですが、本家Writing R Extensionsを含めて、CでRの対話実行を制御するコードが多いので、もっと単純にRの関数を呼ぶコードを書いてみました。 Cのコード コンパイルと実行 Cのコード 初期化の後は.Callや.Exte…

名前付きパイプによるシェルスクリプトの待機と発進

ウェブアプリケーションなどのオンライントランザクションの処理において、時間のかかるタスクを並行処理でオンライントランザクションから分離したいときがあります。方法はfork, thread, MQなど色々とあるのですが、手軽に扱いやすいのは名前付きパイプ(F…

Rで呼び出したFortranのプロシージャからRの関数を呼ぶ方法

仕様上はできそうなので試してみたらできたと言うだけの話なのですが、Rで呼び出したFortranのプロシージャからRの関数を呼ぶ方法を記しておきます。技術的にどうこうと言うのは無いのですが、流れはややこしくて以下のようになります。 .CallでRのコールバ…

Cで計算した常微分方程式の結果を、Rでプロット

「ルンゲクッタ法で様々な連立微分方程式を解く数値計算例(C言語)」のラングフォードの方程式のプロット結果をgifアニメにしてみたので、コードを残しておきます。 Langford Reactor Cで常微分方程式を計算 Rでプロット Cで常微分方程式を計算 gnuplotあたり…

Rでmmap

計算機でmapと言うと、リストの要素を無名関数で一括処理することや(Python)、ハッシュテーブルのような構造(Java)を思い浮かべる人が多いかも知れませんが、mmapはファイルに仮想メモリーを割り当てるOSの提供するAPIです。巨大データを処理したり、高…

Rの拡張でOpenMPを使ってみる

プロセッサのマルチコア化が進んだ現代なので、時間のかかる計算では並列処理をするコードを書くのが望ましいです。スレッドやセマフォの制御を直接プログラミングすると骨が折れるのですが、シングルコア向け逐次処理コードを並列処理に変換してくれるOpenM…

疎な巨大対称行列の一般化固有値問題のC++/Eigenでの効率的な解き方

「水素原子に対するSchrödinger方程式を有限要素法で数値的に解いてみる(C++のソースコード付き)」で紹介されているC++/Eigenのコードを、(ページ著者が)Juliaに移植してみたら12倍くらい速くなったと言うツイートが流れてきて、気になってC++の方のソー…

FASTGLを使ってC++で積分

数値解析における数値積分法の代表としてガウス求積と言う技法があり、それに必要なガウス点と重みの計算でJuliaがC++より桁違いに速いと言う話が流れていたのですが、Juliaで使われているFastGaussQuadrature.jlが使っているアルゴリズムのC++版を使ったと…

モンテカルロ法で円周率を計算するベンチマーク

モンテカルロ法で円周率を計算するベンチマークで、Juliaと比較してgccが悪い言われているのですが、本当なのか検証してみましょう。CとJuliaでこの分岐が単純なマイクロベンチマークを実行すると、乱数生成の速度が結果を大きく左右しえます。後方互換性の…

SIMD拡張命令セットでgcc用のsum関数を書いてみる

とあるJuliaを使った教材に、JuliaやNumPyのsumはSIMD拡張命令セットを使うから速いけれども、C言語でsumを書くとそうではないから遅いような記述があって、CからSIMDを叩けば良いだろうと思ったので、私にしては珍しくC99のコードで、単浮動小数点のsumを書…

最適化レベルで結果が変わってしまうC言語のダメなコード

前世紀に書いたgccで-O1と-O3で実行結果が異なるコードです。インライン展開が作用しました。今のバージョンのgccでどうなるかは確認していません。なお、警告は出ると思いますし、処理系によってはコンパイルが通らない事もあると思います。 #include<stdio.h>int *p</stdio.h>…