HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0606
pandahsp3mt6解決


panda

リンク

2008/6/6(Fri) 22:42:43|NO.16470

Beta板の話で申し訳ないです。
マルチスレッド対応(らしい)の hsp3mt ってどのように使うのでしょうか…。

マニュアルは一通り目を通したつもりですが、
PGO (Profile-Guided Optimization)に最適化…
という項目ぐらいのヒントしかなかったので理解できません…(僕の知識不足ということは承知しています)

とりあえず、タスクマネージャーでの「スレッド」の列では 1 と表示されてました。
スレッドをどんどん作っていくのでしょうか…。

それともまだ未実装なんですか?

ご教授願います。



この記事に返信する


Kpan

リンク

2008/6/6(Fri) 22:55:58|NO.16472

エディタ上での動作は↓を指定してコンパイル実行
> #runtime "hsp3mt"

このランタイムを利用した実行ファイルの出力は
↓を指定して実行ファイル自動作成
> #packopt runtime "hsp3mt.hrt"



panda

リンク

2008/6/6(Fri) 23:18:57|NO.16477

Kpan さん返信ありがとうございます。

説明が悪かったみたいで申し訳ないです。
ご指示のとおりには既にやっておりました。

つまり、
ランタイムおよび、EXEを作成しても、スレッドが1つしか作成されてないみたいです。

タスクマネージャーのプロセスタブで、デフォルトの設定では「スレッド」の列は表示されてないはずです。
プロセスタブで、メニューバーの表示⇒列の選択 により、スレッドを指定できます。

それにより、スレッドの列が表示されますが、hsp3mt ランタイム利用のものでも、シングルスレッドのようです。

つまり、マルチスレッド対応のはずなのにシングルスレッドで表示されているために、
何かの関数などで実行中にスレッドを追加するのかな〜っと思い質問しました。

前述したとおり、マニュアルには目を通しましたが、そのような関数はないみたいです…。
(見落としも否定できませんが、たぶんない)



おにたま(管理人)

リンク

2008/6/7(Sat) 00:30:45|NO.16485

HSP3.2β1のテストありがとうございます。
hsp3mtは、HSPのスクリプトを実行する部分のプログラムを
マルチスレッド対応のライブラリに変更したもので、
現状では内部で複数スレッドを生成しているわけではありません。
また、HSPのスクリプトからスレッドを生成する機能が
あるわけでもありません。
紛らわしくて混乱させてしまってすみません。
マルチスレッド対応のライブラリによる利点は、以下の通りです。

・今後のバージョンでスレッドを使用して高速化が可能になる
・スレッドを使用しているプラグインとの相性が良くなる(かもしれない)
・PGOの機能を利用できる(VS2005はシングルスレッドをサポートしていないので)

今回のhsp3mtは、実験的な意味も含めてプラグインやDLL呼び出し等が
正常に動作しつつ、パフォーマンスが出るかどうか様子を見ている段階です。

速度の違いが比較できるようなスクリプトを作成している人がいたら、
是非ともHSP3.1と、HSP3.2βの通常ランタイム、hsp3mtのランタイムで
どのような違いが出るか、計測してみて報告してもらえると助かります。

こちらでは、hsp3mtの方がいくらか高速になっていると考えているのですが、
ユーザー環境での違いなども見据えて、今後のバージョンに生かして
いきたいと思っています(^^



panda

リンク

2008/6/7(Sat) 01:14:12|NO.16489

おにたま さん返信ありがとうございます。

なるほど、ライブラリを変更しただけで機能はまだ実装されてないと理解してよろしいのですね。

たしかに、以下のスクリプトではマルチスレッドランタイムのほうがスコアはいいようです。
しかし、実数の除算をさせると、マルチスレッドランタイムのほうが低スコアになります。


#uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" #runtime "hsp3mt" ; ランタイム f = ""+dir_win+"\\explorer.exe" exist f : size = strsize : sdim buf,size bload f,buf,size dialog "CPU省電力機能(SpeedStep)によって正しい結果が出ない場合があるので最初に負担をかけます..." repeat 1000 cls 4 cls 0 loop *go repeat 24,1 time = timeGettime() repeat size d = peek(buf,cnt) loop time = timeGetTime()-time sum = sum+time mes "*"+strf("%02d",cnt)+"回目 - 結果:"+time+"ms" loop avg = sum/24 mes "\n平均:"+avg+"ms" stop

僕の場合は
mt:平均 102ms
hsp3:平均 124ms

でした。



panda

リンク

2008/6/7(Sat) 18:43:14|NO.16552

解決するのわすれてました…。



panda

リンク

2008/6/8(Sun) 20:46:05|NO.16579

たびたびすみません。
どうやら、hsp3mt ではシングルスレッドではパフォーマンスは落ちるようです…。


#include "d3m.hsp" ;#runtime "hsp3mt" ; ランタイム title "S.Programs d3module sample" time_start = d3timer() *mainloop ; ループタイマー time = d3timer() - time_start fps = d3getfps() ; フレームレートを表示 title "fps = " + fps + " - max = " +max if (fps > max) : max = fps redraw 0 randomize 0 color : boxf ; カメラ座標を回転させる d3setcam cos(0.001 * time) * 500, sin(0.001 * time) * 750, cos(0.001 * time) * 1000 ; ゼンマイ描画 color 255, 64, 64 ; d3ribbonto 命令使用前の初期化 (d3lineto と似た扱い) d3initlineto repeat 100 x = cos(0.4 * cnt) * 10 * cnt y = sin(0.4 * cnt) * 10 * cnt z1 = -cnt z2 = cnt ; 面を描画するときのコピーモードを設定 gmode 5, , , 64 + rnd(128) ;------------------------------------------------------------ ; リボン状に連続する面を描画 d3ribbonto x, y, z1, x, y, z2 ; └┬──┘ └┬──┘ ; │ └ 位置 2 (x, y, z) ; └── 位置 1 (x, y, z) ;------------------------------------------------------------ loop ; らせん描画 color 255, 255, 64 d3initlineto repeat 100 x = cos(0.3 * cnt) * sin(3.14 * cnt / 100) * 100 y = sin(0.3 * cnt) * sin(3.14 * cnt / 100) * 100 z1 = (cnt-51) * 20 z2 = (cnt-50) * 20 ; 面を描画するときのコピーモードを設定 gmode 5, , , 64 + rnd(128) ; 描画 d3ribbonto x, y, z1, -x, -y, z2 loop redraw await goto *mainloop

スクリプトは HSP3サンプルスクリプト d3m より抜粋。



ONION software Copyright 1997-2023(c) All rights reserved.