
Ubuntu日本語フォーラム
ログインしていません。
LinuxのGUIライブラリにOpenMPを使用して高速化できるか、試してみました。
libXaw-1.0.13 ーーーーー is the X Athena Widgets Library, version 7.
libXft-2.3.2 ーーーーーー is the X FreeType interface library.
libXrender-0.9.8 ーーーー is the X Render Library.
libXvMC-1.0.9 ーーーーー is the X-Video Motion Compensation Library.
libXv-1.0.10 ーーーーーー is the X Window System video extension library.
http://yahoo.jp/box/fLZR2E
開発環境: Puppy linux tahr 6.0.3 / devx_tahr_6.0.2.sfs / AMD Athlon 5350 2.05GHz 4core / memory 4GB
Puppy linux tahr シリーズは ubuntu14.04 のパッケージを流用して作られているのでubuntu派生みたいなものです。
OpenMPはマルチコアcpuでの並列処理をgcc 4.2以上で実現しています。
OpenMPは元のプログラムを変更せず、OpenMP文をforループの前に差し込んで、後は gcc コンパイルオプションに -fopenmp を付けてコンパイル
するだけで、手軽に並列処理が実現でき、上手く作用すれば実行速度が向上します。
cpu動作を50%に制限して使用しているので、高速化の一応の成果は出ています。
高クロックなcpuでは違いが解らないかもしれません。
動作保証などは出来ませんので、試されるのは自己責任でお願いします。
ubuntuは標準だと常駐ソフトが多いので、効果が出にくいか、cpu使用率が上がりすぎて、cpuデットロックが出て止まってしまうかもしれませんので、
テスト用のubuntuを新しく準備して、常駐ソフトを外してからお試し下さい。
OpenMPを使い始めて2週間ほどで、もともと頭も良くありません、英語解らないのでソースリストのコメントを理解していないため、効率良くOpenMP
を使えていないと思います、動作が不安定だったりバグが出たり、試行錯誤を繰り返しています。
ーー コンパイル手順 ーー
端末起動後
# cd /lib***
# ./configure
Makefileをエディターで開き、gcc コンパイルオプション CFLAGS = -g -O2 を検索し -fopenmp を追加します。
# make
# sudo make install
元のライブラリはバックアップ又はリネームして保存した後、
/usr/local/lib に出来たライブラリを /usr/lib にコピーして下さい。
Xサーバーのリスタートを実行後、お試し下さい。
ご意見など、又はOpenMPに詳しく改善出来る方など、より良い物を作ろうと意欲の有る方など、宜しくお願いします。
オフライン
前回に引き続き OpenMP の話ですが、今回は ubuntu のソースファイルを apt-get source パッケージ名でダウンロードした物を使い、
linux bean "bean14043-150820-1.iso" で試してみました。
今回は apt-get source openbox-3.5.2 でソースファイルを入手し、
openbox-3.5.2/obrender/color.c gradient.c image.c render.c theme.c に OpenMPを追加しました。
コンパイルに必要な開発用ファイルを、synapticパッケージマネージャーから関係するパッケージごとインストールします。
openbox-3.5.2-dev
build-essential
pkg-config
libtool
libpango1.0-dev
libglib2.0-dev
libxml2-dev
libxcursor-dev
libimlib2-dev
libstartup-notification0-dev
libxext-dev
x11proto-randr-dev
http://yahoo.jp/box/YGqL_O から圧縮ファイルをダウンロードし、作業するディレクトリーに解凍して下さい。
linux bean には Meldという、ソースファイルを比較するのに便利なソフトがメニューから使えますので、OpenMPを追加したファイルと
元のファイルを見比べてみて下さい。
ーーー コンパイル手順 ーーー
ファイルマネージャーで、openbox-3.5.2/configureファイルのプロパティを開き、パーミッションを実行可能に変更して下さい。
端末を起動し、openbox-3.5.2_omp_sourceを解凍したディレクトリーに移動して下さい。
# cd /openbox-3.5.2
# ./configure --prefix=usr --sysconfdir=/etc
Makefileをエディターで開き、gcc コンパイルオプション CFLAGS = -g -O2 を検索し -fopenmp を追加します。
# make
# sudo make install
/usr/bin/openbox の実行ファイルの日付が、コンパイルした日時に変わっていれば出来ています。
元に戻す場合は、openbox-3.5.2をパッケージマネージャーから再インストールして下さい。
異常が出てGUIが動かない・見れないとなった場合は、[Ctrl]+[Alt]+[F1]キーを押してコマンドモードにし、
sudo apt-get remove openbox-3.5.2
sudo apt-get install openbox-3.5.2
を実行して、Xサーバーの再スタート、又はリブートして下さい。
私の環境 (AMD Athlon 5350 2.05GHz 4core / memory 4GB ddr3-1600) では、openboxの反のうが若干善くなりました。
オフライン
今回はSDL1.2にOpenMPを使用してみました。
puppy linux で SDLをインストールし、エミュレータを試すと音ずれなどがひどいので、改善できるかやってみました。
結果はこれもビミョーながら改善出来ましたが、プラグイン方式のエミュレータでは関係ない話です。
古いエミュレータや、CPUやGPUがアップグレード出来ないマザーボードのPC、又はノートPCなどの方はどうでしょうか。
試す場合は自己責任でお願いします。
充分な動作試験は出来ていません、2つのエミュレータでゲームのオープニングからスタート画面までと、DOOMを試したくらいです。
ーーーーーーーーーーーーーーーー インストール手順 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
http://yahoo.jp/box/JafSPv
から圧縮ファイルをダウンロードして作業用ディレクトリに展開して下さい。
gtkglext-1.2.0.pet
libsdl-1.2.14-w-20110530.pet
sdl-1.2.15-up-20121014.pet
順番にインストールした後、エミュレータやデモなどが動作することを確認して下さい。
端末を起動し作業用ディレクトリに移動
# cd /lib1.2-1.2.15
# ./configure --prefix=/usr
Makefileをエディターで開き、gcc コンパイルオプション CFLAGS = -g -O2 に -fopenmp を追加します。
# make
# make install
/usr/lib/libSDL-1.2.so.0.11.4 のファイルが出来ていれば完了です。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
前回 linux beanを使いましたが、puppy linuxとはライブラリーの格納場所が違うので(ubuntu系は/usr/lib/i386-linux-gnu)、同じようには
インストール出来ません、パスやリンクを通すのか、パッケージ化しないとだめなのか解っていませんので、beanでのインストールは見送りました。
それから、linux beanのパッケージマネージャー synaptic や apt-getでOpenGLの開発用ファイルをインストールしようとするとパッケージ破損
のエラーがでてインストール出来ないので、開発用にlinux beanは使えないと思いwattos R9を試したのですが、beanより動作がスムーズではなく、
ログアウトで1分以上待たされたりと使いにくいです。
lubuntu12.04 64bitも動かなくなりwattos R9 64bitを試したらカーネルパニックで起動しない、ubuntu14.04 64bitでもカーネルパニックの
情報がネット検索すると出てきますが解決事例が見つからないので、ubuntu15.10を待つべきかと考えています。
オフライン
SDL 1.2 OpenMPライブラリを改良しました。
今回も puppy linux tahr 6.0.3 でcompile & install を試しました。
SDL本体のソフトウェアグラフィックとaudioを使うアプリで試して下さい。
OpenGLやALSA、PulseAudioなどを指定した場合と、プラグインライブラリや、sdl-image、sdl-mixer、sdl-ttfなどのSDL拡張ライブラリは
OpenMPを使っていませんので早くなりません、SDL本体機能のみOpenMPが働きますので、SDL本体機能を使っていないアプリは早くなりません。
お試しの際は、くれぐれも自己責任でお願いします。
ーーーーーーーーーーーーーーーー インストール手順 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
http://yahoo.jp/box/hLGiGQ
から圧縮ファイルをダウンロードして/tmpに展開して下さい。
/tmp は ramdiskになっているのでcompileが早いです。
メモリーが多ければ/tmpで、メモリーにあまり余裕がなければHDD等で作業して下さい。
端末を起動
# cd /tmp/lib1.2-1.2.15
# ./configure --prefix=/usr
Makefileをエディターで開き、gcc コンパイルオプション CFLAGS = -g -O2 に -fopenmp を追加します。
# make
# make install
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
前回 wattos R9 32bitを試して、使いにくかったのでリポジトリを変更してアップグレードし、ubuntu 15.04パッケージバージョンにした所、
動作がスムーズになり快適になりました。
ただしUSB無線lanを使っている場合、端末でiwconfigを実行してPower Management:offになっていないと通信で不具合が出ますので、端末で
sudo iwconfig wlan0 power offを実行(wlan0はiwconfigで表示されるものに書き換えて下さい)
また、iwconfigで確認して下さい。
自分がインストールしているlinuxを調べた所、puppy linux tahrはoff、debian 8 32bit、linux bean、wattos R9 32bitはonになっていましたので
debian系とubuntu系のlinuxでUSB無線lanを使っている方は、iwconfigで確認されたほうがいいと思います。
オフライン
前回、wattos R9 32bitをアップグレードしたものを、もう一度アップグレードし ubuntu 15.10パッケージバージョンにしました。
これにより、libxaw-1.0.13、libxft-2.3.2の修正メンテ済みライブラリを apt-get source でダウンロードしました。
以前のものは削除しましたのでご了承下さい。
最初に作成した物は、開発元のxlibオリジナルソースファイルを元にしていたもので、修正パッチが必要だと気ずいていませんでした。
また、OpenMP文を追加した物も、puppy linux tahrの ウィンドマネージャー jwmではバグが出ないのに openboxだとウィンドウのタイトルと
メニューが文字化けして暴走するバグが出て、悩まされました。
今回、バグが出ていたlibxft-2.3.2/src/xftrenderの中を修正しopenboxでも使える様になったのでwattos R9での使用手順を説明します。
最初に、wattos r9をubuntu 15.04パッケージにアップグレードして下さい、手順はubuntuと同じです、linux beanも同じだと思います。
アップグレードしないとlibxaw-1.0.13とlibxft-2.3.2はパッケージマネージャーに登録されていないので使えません。
アップグレードで問題が出る場合も有りますので、8GB程のUSBメモリーにインストールし、テスト用として使用しHDDや常用しているシステムには
使用しないで下さい、責任は取れませんので、自己責任でお願いします。
テスト用osの準備が出来ましたら、次にコンパイルに必要なパッケージをパッケージマネージャーでインストールして下さい。
build-essential
pkg-config
libtool
libXaw-1.0.13-dev
Xft-2.3.2-dev
http://yahoo.jp/box/uCXUHg
から圧縮ファイルをダウンロードし/tmpに展開して下さい。
puppy linux tahr、wattos R9、linux beanの /tmpはramdiskの設定になっていますので、メモリーに余裕が有ればコンパイルが早く終わります。
端末起動後
# cd /tmp/libxaw-1.0.13 又は xft-2.3.2
# ./configure
lib***/src/Makefileをエディターで開き、gcc コンパイルオプション CFLAGS = -g -O2 を検索し -fopenmp を追加します。
# make
# sudo make install
/usr/local/lib に出来たライブラリをコピーして下さい。
sudo cp /usr/local/lib/lib***.a /usr/lib/i386-linux-gnu
sudo cp /usr/local/lib/lib***.so.*** /usr/lib/i386-linux-gnu
一旦ログアウトし、再度ログインし異常がなければウインドウの表示や文字表示速度が速くなったか確認して下さい。
異常が出た場合や速度に違いが出ない場合は、libxawとlibxftを再インストールして下さい。
私の環境では、ファイルマネージャーや、firefoxとwineの表示が速くなりました、google chromeは独自のフォントライブラリを使うので変わりません、
オフィスソフト等も独自のTTFフォント処理を使っているらしいので変わらないと思います。
QTはxlibを使いませんのでQTを使うソフトも変わらないと思いますので、ご自分の使いたいソフトがxlibを使っているか調べてから試して下さい。
linuxはライブラリに統一性が無いので別々のライブラリをそれぞれ改良しないと速くなりません、開発元が改良するまで待つか、高性能PCを買って下さい。
オフライン
前回、wattos R9、linux beanの /tmpはramdiskの設定になっていると書いたのは間違いでしたすいません。
ネットで ubuntu 14.10 /tmp tmpfs とかで検索するとヒットしますので設定してみて下さい、メモリーに余裕があればいろいろ使えて便利です。
firefoxとgoogle chromeのキャッシュをtmpfsにした/tmpに移動すると反応が良くなります。
ただし、google chromeはブラウザゲームをflashで長時間プレイして、キャッシュがいっぱいになるとクラッシュしたことがあるので、一旦chromeを
終了してキャッシュクリアーするなど対策が必要な場合が有ります。
最近はchromeでブラウザゲームをしていないので、現在使っているpuppy linux tahr 6.0.3とgoogle chrome 45ではキャッシュオーバーのクラッシュ
は体験していません。
tmpfsの設定の一例は下記を端末から実行して下さい。
# sudo vi /etc/fstab
tmpfs /tmp tmpfs defaults,noatime 0 0
ファイルに設定を追加し保存終了して、再起動して端末でdfコマンドを実行して確認して下さい。
firefoxのキャッシュはConfiguration Maniaのアドオンで、ブラウザのキャッシュを選択してキャッシュの場所を変更すれば簡単に出来ます。
google chromeは起動オプションに --disk-cache-dir=/tmpを追加して下さい。
オフライン
OpenMPを使ったライブラリはバグが取りきれていませんでしたので、リンクを削除いたします、申し訳ございませんでした。
ダウンロードした方は使用せずにファイルを削除して下さい。
効率を上げるためOpenMPの使用箇所を増やした所、余り表面化しないバグが残ってしまいました、労力に対して速度向上が微妙
なので今後は公表する事は止めにします。
オフライン
今回、OpenMPを使ったライブラリの高速化でパフォーマンスの改善策が見つかりましたので、報告します。
ネット検索で linux 並列処理 などと調べていた所、FreeBSD と ubuntu でのマルチスレッド処理の実行比較で、ubuntuがスレッド数の増加に比例して
遅くなるというのを見たところ、C言語の malloc関数がマルチスレッドの対応が不十分で FreeBSD は jemalloc を使っていると書かれていました。
対策として、 jemalloc をパッケージマネージャーでインストールし、LD_PRELOADという環境変数を設定する事で malloc を jemalloc に置き換える
事でコンパイルせずに改善出来ました。
/etc/ld.so.conf ファイルに
32bit版 LD_PRELOAD=/usr/lib/i386-linux-gnu/libjemalloc.so.1
64bit版 LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.1
を追加して下さい。
ただし、FreeBSD の jemalloc や google の tcmalloc でもバグ報告が有りますので、ご自分の使い方でバグが出ないかを調べてから、自己責任で行って
下さい。
OpenMPでの並列処理で malloc を使っている場合に、OpenMPを使わないノーマルよりも遅くなる事が有ったので jemalloc を使う事で改善が見られました
が、linux のシステムライブラリの xlib は malloc を多く使っていますので、やはり最初から並列処理対応のライブラリに変わらないと、linuxの実行速度は
ソフトウェアだけでは、なかなか上がらないと感じました。
オフライン