Polycephaly: これは何?どう使うの?

投稿日: 2011年3月22日, 投稿者: csj editor

Cincom SmalltalkのプロダクトマネジャであるArden Thomas は、ネバダ州ラスベガスで開催されたSmalltalk Solutions 2011 において、Polycephaly について講演しました。

Cincom SmalltalkのプロダクトマネジャであるArden Thomas は、ネバダ州ラスベガスで開催されたSmalltalk Solutions 2011 において、Polycephaly について講演しました。下記は、Arden のブログの投稿です。

今月 Polycephaly について、Smalltalk Solutions でプレゼンテーションを行います。これは、マルチコアプロセッサを利用するためのCincom Smalltalk フレームワークです。もし、ご参加いただければ、Polycephaly に関する詳細情報や試行結果をご覧いただけます。

Polycephaly は、多くの顧客に恩恵をもたらすことを確信しております。それを実践できるよう、簡単なサンプルを公開します。

すべての顧客のプロセスを毎日記録していると仮定します。(一般的な例なので、いろいろな処理を実行しています)。

まず、顧客のセグメント分けが必要です。顧客グループの同時処理の基本になります。顧客を単純に、名前の最初の文字で分割します。1つのグループとして、”A”、別グループとして“B” … “Z”で始まる名前のすべての顧客を処理します。

“A” から “Z”のコレクションを作成するメソッドから始めます。

aToZ
       “A から Z の文字”
       "SharedQueue は、同時発生アクセスを管理します"
       | queue |
       queue := SharedQueue new: 26.
       (10 to: 35) do:[:ea | queue nextPut: (String with:
       (Character digitValue: ea)) ].
       ^queue

次に、処理を制御して、振り分けるメソッドを作成します。processAToZ をコールします。

processAToZ
"self processAToZ"
"これは、マルチコアを使用した問題を解決するために、Polycephaly を
使用する一般例です。
この例では、文字ごとにばらばらにプロセスを取り出します。
例えば、'A'で始まる名前、すべての'B'というように別々にすべての顧客の
処理を行います。"
| letterQueue done results vms |

"A .. Z文字のコレクション(SharedQueue)"
letterQueue := self aToZ.

"続行する前にすべての処理が完了するまで待ちます"
done := Semaphore new.

"安全な同時アクセスにSharedQueues を使用"
results := SharedQueue new.

"3つのヘッドレス処理イメージを作成
- 動作確認用に異なったサイズのベンチマークにします"
vms := Polycephaly.VirtualMachines new: 3.

"マシン(ヘッドレスイメージ)同様に多くのプロセスをフォークします。
各プロセスは文字を取り込み、処理するためにマシンに送ります。

結果は戻され、追加され、そして別の文字を無くなるまで取り込みます。
処理する文字が無くなった後、マシンをリリース(イメージをクローズ)して、
完了を通知します"
vms machines do: [:machine |
[ | letter |  
[letter := letterQueue nextAvailable.
 letter isNil] whileFalse: [results nextPut: (machine do:
[:ch | ProcessAtoZ  processLetter: ch ]  with:letter)].
        machine release.                 "Shut down the vm"
       done signal] fork].                "Signal that the
       machine has completed its work"
vms machines  size timesRepeat: [done wait].  "Wait until
each machine has reported in as completed"

^ results

最後に、#processLetter: を下記のように実装します。

processLetter: letter
                | letters |
               letters := OrderedCollection new: 100.
               1 to: 100 do:[:n | letters add: letter ].
               ^letters

このコードのパーセルがほしい場合には、athomas@cincom.com にご連絡ください。

このコードを使用するには、イメージを起動して、Polycephaly をロードして、このパーセルをロードして、イメージの保存です。(起動されたヘッドレスイメージは、このメインイメージのコピーなので、最初にイメージを保存するまで、Polycephaly (#processLetter:)は動作しないでしょう。)#test メソッドを実行して、Polycephaly が動作していることを確認して、#processAToZ の結果をインスペクトします。

おめでとうございます。これで、アプリケーションの性能をアップするための方法を手に入れました。

この結果があなたに恩恵をもたらすことを願っております。

– Arden

ここに Smalltalk Solutions 2011 でArden が使用したプレゼンテーションがあります。

Tagged with:
 

Comments are closed.



過去のニュース