LoginSignup
3
0

More than 5 years have passed since last update.

マルチコア対応 Forth 系言語 Paraphrase の紹介

Last updated at Posted at 2019-01-09

はじめに: Paraphrase での並列処理

 Paraphrase では、括弧もしくは二重括弧で囲むだけで並列処理が記述できます。ある並列処理から別の並列処理へと情報を渡すパイプ(チャネル)も用意されているので、scatter-gather モデルによる並列計算も可能です。

単一の別スレッドで実行:
単一の大括弧 [ と ] で囲んで、[ doSomething ] と書けば、 別スレッドで doSomething が実行されます。

複数のスレッドで実行:
二重大括弧 [[ と ]] で囲んで、[[ doSomething ]] と書けば、 複数のスレッドで doSomething が実行されます。 デフォルトでは CPU の数分のスレッドが走り出すので、 4 コア 8 (CPU)スレッドの環境であれば、8 個の並列処理が開始されます。 AMD の 2990wx は 32 コア 64 (CPU) スレッドとのことですので、 64 個の並列処理が走ることでしょう(未確認)。

普通にメインスレッドで実行:
括弧で囲まずにそのまま doSomething と書けば、 インタプリタのメインスレッドにて doSomething が実行されます。

目次

  1. 特徴
  2. プログラム例
  3. ダウンロード
  4. インストール
  5. 起動方法
  6. 終了方法
  7. チュートリアル等

1. 特徴

  1. 整数値だけではなく、浮動小数点値や多倍長整数、リストなども使用可能
  2. マルチプラットフォーム対応 - Mac, Linux(Ubuntu),Windows10 で動作を確認
  3. 作者が日本人 - 日本語で OK

2. プログラム例

// 1〜1,000 万までに存在する素数の個数を調べる。

"prime?" :
    switch
        dup 1 ==    -> drop false break
        dup 2 ==    -> drop true  break
        dup 2 % 0?  -> drop false break
        // otherwise
        true swap dup sqrt ceil >int 3 swap
        for+ dup i % 0? if swap drop false swap leave then 2 step next drop
    dispatch
;

reset-pipes
// 奇数については並列処理で調べる
[ 3 10000000 for+ i >pipe 2 step next ]

[[  // 複数スレッドで検証作業(=woker thrread)
    while-pipe
        dup prime? if >pipe else drop then
    repeat
]]

() 2 dup prime? if append then // 2 については、ここで調査
while-pipe append repeat { < } sort
( "numOfPrime=%d (%d ... %d)\n" ${ size } ${ car } ${ last } ) printf
drop

上のプログラムを実行すると、

numOfPrime=664579 (2 ... 9999991)
 ok.

と表示されます。素数の個数と、7 桁の最大の素数 9999991 も正しく表示されています。

 マルチコアスケールアウトの状況ですが、上記のプログラムを 4 コア 8 スレッドの Core i7-7700K (4.2 GHz) で実行したところ、以下のような結果となりました。

注:Windows では time コマンドがないので、-t オプションにて計測できるようにしてあります。

C:\...\Paraphrase\samples>test_countPrimeMT -t
numOfPrimes=664579 (2 ... 9999991)
real: 8.4077[s]
user: 63.4063[s]
sys : 0.0938[s]

user/real の値は約 7.5 となり、ほぼ全コア(全 CPU スレッド)がフル稼働になっていることが分かります。

3. ダウンロード

 各プラットホーム用ビルド済みライブラリは GitHub (https://github.com/iigura/Paraphrase/releases) より入手して下さい。

4. インストール

 ビルド済みパッケージを使用する場合、インストール作業は不要です。適当な場所に展開して下さい。boost や readline を使用しているので、場合によってはこれらが必要になるかもしれません。必要に応じて、boost や readline をインストールして下さい。

 ソースコードからビルドする場合は、git clone https://github.com/iigura/Paraphrase.git して、Paraphrase ディレクトリの直下にある BUILD.txt を参考にビルドして下さい。

5. 起動方法

 Paraphrase ディレクトリ直下にある para (Windows の場合は para.exe)を実行して下さい。

6. 終了方法

 Windows では Ctrl-Z を入力(リターンキーも押して下さい)するか Ctrl-C で終了します。Mac および Linux 版では Ctrl-D もしくは Ctrl-C にて終了します(readline のヒストリに記録されるので、Ctrl-D の使用がオススメです)。

7. チュートリアル等

 現在、処理系の開発が終わったばかりであり、解説文書や入門ドキュメント等まで手が回っていません。現在のところはワードリファレンス(単語辞典: docs/words/index.html)しかありませんが、各ワードにおける使用例を載せていますので参考にしてみて下さい。

 Paraphrase に関する解説文書や入門書などは今後作成していく予定です。不明な点などがありましたら、この文書に対するコメント(およびメンション)等を使って知らせていただければ助かります。ニーズの高そうなものから順次書いていきたいと思います。

 その他、Twitter ( @paraphrase_lang ) や Facebook ( Paraphrase ユーザー会 ) にて発信中です。バグレポートや要望・質問などは Facebook の方に書いて頂ければ助かります。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0