2013年2月16日土曜日

このBlogについて

このブログはチラシの裏の落書き的メモ置き場です.
Pythonとかそこら辺のチップスのようなものをつらつら書いていく予定です.
飽きるまで.

EPDのMKLをマルチスレッドで実行する方法

概要

EPDでNumpyの行列-行列積をレッツノートJ10(i3 2350m)とデスクトップ(i5 2500k)で実行したが,性能が周波数分程度しか変わっていない.
どうやら,デフォルトではマルチスレッドでプログラムが走らないらしい.それでも,下手にC言語で行列演算をするよりもMKL連携のNumpyの方が高速なのだが,まさかMKLがマルチスレッドに対応していないわけがないと思うので,方法を探した.
方法発見までそこそこ苦労したのでまとめる.

方法

import mkl
mkl.set_num_threads(MyNum)

MyNumにスレッド数を入れる.これだけ.
あとは全部NumpyとMKLが上手くやってくれる.

ベンチ

デスクトップ環境(定格i5 2500k)で超簡単な行列-行列積ベンチマークを行ったので,ソースと実行結果を示す.なお,EPDは64bit版でOSはWindows7 64bit,メモリは16GB.

ソース:

import time import mkl import numpy as np mkl.set_num_threads(4) num2 = 10000 #行列サイズ #計算用の行列作成 starttime = time.clock() A = np.ones((num2,num2),'d') B = np.ones((num2,num2),'d') #行列作成の時間出力 print time.clock() - starttime #行列-行列積の実行 starttime = time.clock() C = np.dot(A, B) # 実行時間と演算性能の出力 print time.clock() - starttime print str(2*num2**3/(time.clock() - starttime)*1e-6) + u" [MFROPS]"

結果:

スレッド数1: 0.465379485104 77.7279291321 25730.7639873 [MFROPS] 
スレッド数2:
0.45703352782 39.7218425794 50350.0858396 [MFROPS]
スレッド数4: 0.358474042039 22.0854201077 90557.3095905 [MFROPS]
スレッド数8: 0.459133079081 22.1900988011 90130.1277687 [MFROPS]
インテルによるとi5 2500kの理論性のはターボ無しで105.6 [GFLOPS] = 105600 [MFLOPS]らしいので,4スレッドで実行すると85.8 %の実行効率が得られたことになる. これほどの性能が得られるとちょっと信じがたい値だ. ループのない簡単な演算を行うコードならCythonは必要無さそう.理論性能をい引き出したとしても,性能向上の余地は17 %しかないということなのだから. そして,Visual Studio C++で行列演算プログラムを作成してもせいぜい10 %しか実行効率を得られない自分は行列演算では大人しく計算ライブラリやPythonのNumpyを使うべきなのだろう.

EPDについて

Enthought Python Distribution (EPD)

Pythonは単体では殆ど使えない.
なので,必要に応じてパッケージをインストールしていくわけだが,パッケージ間の連携やバージョン管理などが面倒くさすぎる.
幸いにして,複数のパッケージをまとめて管理してくれるものがいくつかあるので,それを活用する.
今のところ自分はPythonをMatlabの代わりとして使いたい(実験データの処理とグラフ作成,正直Matlabのするべきことではない)ので,Numpy,Scipy,Matplotlibが必要となる.

自分は学術計算用Pythonパッケージの管理を一括でしてくれるEPDを使用している.PythonxyのほうがSpyderまで一括でインストールされて楽だが,後述の利用でEPDを選択した.

有償だが機能が少ない(ただし,Numpy,Scipy,Matplotlibと自分に必要なパッケージの揃った)Free版もある.
アカデミックは無償でフルパッケージの利用ができるため,自分はこれを使用している.
フルパッケージ版の特徴としては,Numpy,ScipyにおけるMKL連携,Windows版では64bitバージョンがあること(FreeではWindowsは32bitのみ),豊富なパッケージ(自分には使い道が分からない.Cythonはそのうち勉強しておきたいけど)がある.
当初はFree版でも良いと思っていたが,フルパッケージ版のMKL連携が気に入ったため,アカデミック版用に登録をした.
登録には”.ac”の入ったメールアドレスが必要となる.
具体的な手順はHPに(英語で)書いてあるし,分からないことがあればググれば良いと思う.

2013年2月2日土曜日

Python,Matplotlibでギリシャ文字出力方法


# --- グラフにギリシャ文字を書きたい場合 --- #
方法1:TeXを使う
$ドルマークで囲まれた範囲はtex形式になる$
例:
label=('$\mu$')#
μが出力される
問題点:
フォントがTeXのものになるため,Arialなどとデザインが合わない

方法2:文字コードを指定する
u'\uhoge'
''の前にuをつける(u'hoge')ことで文字コードがUTF-16に指定される模様
\uhogeでhogeに文字コードを指定する
例:
label=u'\u03bc'#使用しているフォントでμが出力される
#03bcがギリシャ文字μのUTF-16進のコード
問題点:
使用しているフォントにその文字がない場合文字が表示されない
Arialで日本語のコードを入力すると□出力を確認
ギリシャ文字を使用するならギリシャ文字を含むフォントが必要
……ギリシャ文字は大体のフォントに含まれている気がする
論文投稿でギリシャ文字はSymbolと規定されていたりする

ギリシャ文字と文字コード対応表
U+
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0370
Ͱ
ͱ
Ͳ
ͳ
ʹ
͵
Ͷ
ͷ


ͺ
ͻ
ͼ
ͽ
;

0380




΄
΅
Ά
·
Έ
Ή
Ί

Ό

Ύ
Ώ
0390
ΐ
Α
Β
Γ
Δ
Ε
Ζ
Η
Θ
Ι
Κ
Λ
Μ
Ν
Ξ
Ο
03A0
Π
Ρ

Σ
Τ
Υ
Φ
Χ
Ψ
Ω
Ϊ
Ϋ
ά
έ
ή
ί
03B0
ΰ
α
β
γ
δ
ε
ζ
η
θ
ι
κ
λ
μ
ν
ξ
ο
03C0
π
ρ
ς
σ
τ
υ
φ
χ
ψ
ω
ϊ
ϋ
ό
ύ
ώ
Ϗ
03D0
ϐ
ϑ
ϒ
ϓ
ϔ
ϕ
ϖ
ϗ
Ϙ
ϙ
Ϛ
ϛ
Ϝ
ϝ
Ϟ
ϟ
03E0
Ϡ
ϡ














03F0
ϰ
ϱ
ϲ
ϳ
ϴ
ϵ
϶
Ϸ
ϸ
Ϲ
Ϻ
ϻ
ϼ
Ͻ
Ͼ
Ͽ
1F00
ἀ
ἁ
ἂ
ἃ
ἄ
ἅ
ἆ
ἇ
Ἀ
Ἁ
Ἂ
Ἃ
Ἄ
Ἅ
Ἆ
Ἇ
1F10
ἐ
ἑ
ἒ
ἓ
ἔ
ἕ


Ἐ
Ἑ
Ἒ
Ἓ
Ἔ
Ἕ


1F20
ἠ
ἡ
ἢ
ἣ
ἤ
ἥ
ἦ
ἧ
Ἠ
Ἡ
Ἢ
Ἣ
Ἤ
Ἥ
Ἦ
Ἧ
1F30
ἰ
ἱ
ἲ
ἳ
ἴ
ἵ
ἶ
ἷ
Ἰ
Ἱ
Ἲ
Ἳ
Ἴ
Ἵ
Ἶ
Ἷ
1F40
ὀ
ὁ
ὂ
ὃ
ὄ
ὅ


Ὀ
Ὁ
Ὂ
Ὃ
Ὄ
Ὅ


1F50
ὐ
ὑ
ὒ
ὓ
ὔ
ὕ
ὖ
ὗ

Ὑ

Ὓ

Ὕ

Ὗ
1F60
ὠ
ὡ
ὢ
ὣ
ὤ
ὥ
ὦ
ὧ
Ὠ
Ὡ
Ὢ
Ὣ
Ὤ
Ὥ
Ὦ
Ὧ
1F70
ὰ
ά
ὲ
έ
ὴ
ή
ὶ
ί
ὸ
ό
ὺ
ύ
ὼ
ώ


1F80
ᾀ
ᾁ
ᾂ
ᾃ
ᾄ
ᾅ
ᾆ
ᾇ
ᾈ
ᾉ
ᾊ
ᾋ
ᾌ
ᾍ
ᾎ
ᾏ
1F90
ᾐ
ᾑ
ᾒ
ᾓ
ᾔ
ᾕ
ᾖ
ᾗ
ᾘ
ᾙ
ᾚ
ᾛ
ᾜ
ᾝ
ᾞ
ᾟ
1FA0
ᾠ
ᾡ
ᾢ
ᾣ
ᾤ
ᾥ
ᾦ
ᾧ
ᾨ
ᾩ
ᾪ
ᾫ
ᾬ
ᾭ
ᾮ
ᾯ
1FB0
ᾰ
ᾱ
ᾲ
ᾳ
ᾴ

ᾶ
ᾷ
Ᾰ
Ᾱ
Ὰ
Ά
ᾼ
᾽
ι
᾿
1FC0
῀
῁
ῂ
ῃ
ῄ

ῆ
ῇ
Ὲ
Έ
Ὴ
Ή
ῌ
῍
῎
῏
1FD0
ῐ
ῑ
ῒ
ΐ


ῖ
ῗ
Ῐ
Ῑ
Ὶ
Ί

῝
῞
῟
1FE0
ῠ
ῡ
ῢ
ΰ
ῤ
ῥ
ῦ
ῧ
Ῠ
Ῡ
Ὺ
Ύ
Ῥ
῭
΅
`
1FF0


ῲ
ῳ
ῴ

ῶ
ῷ
Ὸ
Ό
Ὼ
Ώ
ῼ
´
῾


貼り付け元  <