[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 10/27 07:58 / Filesize : 141 KB / Number-of Response : 567
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

MMX SSE 3D NOW!のプログラミング



1 名前:デフォルトの名無しさん [04/05/28 22:00]
どうぞ

2 名前:デフォルトの名無しさん [04/05/28 22:02]
2get
>>3どうぞ

3 名前:デフォルトの名無しさん [04/05/28 22:07]
2get
>>3どうぞ

4 名前:デフォルトの名無しさん mailto:sage [04/05/28 22:36]
またこの手のスレか
またこの手のスレか

5 名前:デフォルトの名無しさん mailto:sage [04/05/28 23:37]
VC++6.0SP6用のProcessor Pack早くだせよヴォケ

6 名前:デフォルトの名無しさん mailto:sage [04/05/29 05:13]
速くしろよ

7 名前:デフォルトの名無しさん mailto:sage [04/05/29 05:36]
/arch:SSE2

8 名前:デフォルトの名無しさん mailto:sage [04/05/29 07:14]
>>5
もうでねぇよ

9 名前:デフォルトの名無しさん mailto:sage [04/05/29 12:31]
アセンブラスレでいいだろ

10 名前:デフォルトの名無しさん mailto:sage [04/05/29 17:18]
>>8
マジ?早く出せよヴォケ!



11 名前:デフォルトの名無しさん mailto:sage [04/05/29 17:56]
すぐにアセンブラって言出す奴はアレだな
インテルのコンパイラなんかには
C++のライブラリが含まれているがな。

12 名前:デフォルトの名無しさん [04/05/30 00:08]
>>11
それってソース付き?

13 名前:デフォルトの名無しさん mailto:sage [04/06/13 18:02]
VC Toolkit 2003 で効率よくSSE2使うコツを話そうぜ。

14 名前:デフォルトの名無しさん ◆TCP/IPmFAM mailto:sage [04/09/26 17:22:39]


15 名前:デフォルトの名無しさん [04/10/19 06:28:21]
>>13
#include <dvec.h>

16 名前:デフォルトの名無しさん [04/10/23 07:26:59]
SSEを使った簡単なプログラムを教えてください。
たとえば1+2はどのように書けばよいのでしょうか?


17 名前:デフォルトの名無しさん mailto:sage [04/10/23 09:13:35]
SSE3のスレかと思ったぜ

18 名前:デフォルトの名無しさん mailto:sage [04/10/23 15:39:43]
SSE3って何が新しいの?っていうか普及すんの?

19 名前:EXCULTer's / Active metropolis ◆/80RBXpvJA [04/11/12 05:14:46]
MASM32w

20 名前:デフォルトの名無しさん [04/11/22 16:09:13]




21 名前:デフォルトの名無しさん [04/12/08 08:53:11]
MMXを使用してフルカラーの画像を拡大縮小するルーチンを書きたいのですが、
どっかに手頃なソースは落ちてないもんでしょうか。
できれば品質ではなくスピード重視のものがいいのですが。

22 名前:21 mailto:sage [04/12/08 09:12:25]
どうもここら辺が都合が良さげなので調べてみます。

> SDL_Surface * zoomSurface (SDL_Surface *src, double zoomx,
> double zoomy, int smooth);
> Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
> 'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1
> then the destination 32bit surface is anti-aliased. If the surface is not 8bit
> or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
www.ferzkopp.net/~aschiffler/Software/SDL_gfx-2.0/

23 名前:21 mailto:sage [04/12/08 15:46:22]
中身除いてみたらMMX使ってなかったよ... orz
自分で勉強しなきゃ駄目なのかな、とほほ...

24 名前:21 mailto:sage [04/12/09 04:08:26]
MMXの解説読んでみたら、画像の拡大縮小には
MMXの命令セットは使えそうにもない事が
判明しました。どうすればいいんだ...orz

25 名前:デフォルトの名無しさん mailto:sage [04/12/12 10:16:56]
>21-24
ほい>61.23.56.118/bilinear.zip
テストしてないし、補完テーブル作るとこだけ面倒でCだけど。

26 名前:21 mailto:sage [04/12/13 07:59:28]
おお、いつの間にかレスが! ありがたや、ありがたや。
早速試してみます。

27 名前:デフォルトの名無しさん [05/02/21 12:55:29 ]
MMXでDWORDにアンパックしたやつをDWORDで乗算させるにはどうしたらよいんですか?
pmulはWORDしか対応していないようなので…
誰か助けてください

28 名前:デフォルトの名無しさん [05/02/21 14:44:56 ]
>>27
ヒント
a, b, c, d は16bitの整数で
X = a * 2^16 + b
Y = c * 2^16 + d
とおくと、

X * Y
= (a * 2^16 + b) * (c * 2^16 + d)
= (a*c * 2^32) + ((a*d + b*c) * 2^16) + b*d

あとはお好きなように。


29 名前:デフォルトの名無しさん [05/02/21 14:46:24 ]
あ、^はXORじゃなくて累乗ね

30 名前:デフォルトの名無しさん mailto:sage [05/02/21 16:56:55 ]
素直にシフト使って書けばそんな断りもいらなさそうなものだが。




31 名前:デフォルトの名無しさん mailto:sage [05/02/21 18:01:39 ]
>>28
ありがとうございます。
おちついて調べてみたら、DWORDではなくWORDの乗算でした…
WORDならなんとかなりそうです。

32 名前:デフォルトの名無しさん mailto:sage [05/03/16 05:30:09 ]
>>25
再upして頂く事は出来ませんでしょうか・・・

33 名前:デフォルトの名無しさん [2005/07/07(木) 12:01:11 ]
SSEへの最適化のための構造体のアライメントってどうやって調べるのでしょうか?

34 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 22:12:42 ]
ヒント: offsetof

35 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 23:23:13 ]
>>33
テキトーにベンチマークプログラム書いて調べるとかw
4kB境界に合わせればほぼ確実に最適だと思う

36 名前:デフォルトの名無しさん mailto:sage [2005/07/11(月) 14:27:39 ]
3D NOW!使ってるヤシいる?
俺はIntelCPUなのでMMXやSSEしか使ったことがないが。

37 名前:デフォルトの名無しさん mailto:sage [2005/07/15(金) 17:42:50 ]
>>36

pfacc系がとっても便利で気に入っている。

38 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 16:25:52 ]
>>37
上位と下位の加算か!
いいなあ。MMXやSSEでは使えないもんな。
SSE3には入ったみたいだけど。

39 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 17:57:27 ]
自分の環境だと初代SSEまでしか使えないorz
新しいコアのAthlon買うかねぇ。

SSEで内積やる時に各積の加算ってどうやってる?
面倒なんでインラインから抜けて普通に書いちゃってるんだけど。

40 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 19:10:24 ]
>>39
内積やってないけど、抜けたらせっかくのインラインが遅くならない?
俺ならシャッフルして2つ同時に足すかな。

xmm0=(a,b,c,d), xmm1=(e,f,g,h) として、
movaps xmm2, xmm0
shufps xmm0, xmm1, hoge
shufps xmm2, xmm1, hoge

するとこうなる。
xmm0=(e,f,a,b), xmm1=(g,h,c,d)

で、addpsやって同じようにもう1回足せば出るかな。
面倒なのでここまで。すまぬ。



41 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 19:49:30 ]
やっぱり続き。

movaps xmm2, xmm0
shufps xmm0, xmm2, hoge
addps xmm0, xmm2

これでOKか?試してないけど。
xmm0=(?,e+f+g+h,?,a+b+c+d) となるはず。

42 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 23:45:43 ]

>>40-41
なるほど。自分ではこんなん考えてみけどどうだろう。

movaps xmm2, xmm0;   xmm2 = (a,b,c,d) xmm0 = (a,b,c,d) xmm1 = (e,f,g,h)
unpcklps xmm2, xmm1;   xmm2 = (g,c,h,d)
unpckhps xmm0, xmm1;  xmm0 = (e,a,f,b)
addps xmm0, xmm2;    xmm0 = (e+g, a+c, f+h, b+d)
movhlps xmm1, xmm0;   xmm1 = (c, d, e+g, a+c)
addps xmm0, xmm1;    xmm0 = (c+e+g, a+c+d, e+f+g+h, a+b+c+d)
movlps [dst], xmm0;    下半分だけ取り出す。

43 名前:デフォルトの名無しさん mailto:sage [2005/07/26(火) 12:50:37 ]
なるほど、規則的なシャッフルならアンパックの方がきれいだね。
簡単なコード書いて速さの測定でもしてみるか。

44 名前:デフォルトの名無しさん mailto:sage [2005/07/26(火) 14:10:13 ]
まあどっちにしろストールするような気がするけどねorz
2回連続のシャッフルないしアンパックをどうにかしてばらせないかなぁ

45 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 16:10:13 ]
Intelのページに、SSE3を使わないコードと使うコードの例が載ってた。

mulps xmm0, xmm1
movaps xmm1, xmm0
shufps xmm0, xmm1, 0xb1
addps xmm0, xmm1
movaps xmm1, xmm0
shufps xmm0, xmm0, 0x0a
addps xmm0, xmm1

これは1個ずつやっているな。


mulps xmm0, xmm1
haddps xmm0, xmm0
haddps xmm0, xmm0

SSE3はすごいなあ。同じhaddpsを続けただけでできてしまう。
ていうか3D Now!もそうか。K6-2が、はまればすごく速かったのがわかる気がした。

ただ、Prescottではhaddpsのタイミングが13-4なんだよな。
上のコードに7+13+13 = 33clkもかかる。
Athlon64だとhaddpsが5-2、mulpsが5-2。5+5+5 = 15clkかな。

ただ、Pen4ならこの33clkのブロック自体を何個も並列に実行しそう。


2個同時でも
haddps xmm0, xmm1
haddps xmm0, xmm0
これでOK。何者だよっていう簡単さだな。
内積を、どう利用するかによって、移動命令で欲しい形式に落とすのも腕の見せ所。

46 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 18:54:46 ]
>>45
やっぱ要素間演算がないのは皆不満だったらしいね。
便利だけど自分の環境じゃ試せないのが痛いなぁ。

にしてもSSE3は便利なのはいいけどホント遅そうだ。

47 名前:デフォルトの名無しさん mailto:sage [2005/07/29(金) 10:06:21 ]
そんなに遅くはないんじゃない?
Prescottはもう死にかけのアーキだし、K8なら速いし。
YonahのSSE3も速くなってると思う。

48 名前:デフォルトの名無しさん mailto:sage [2005/07/31(日) 10:18:47 ]
そうかぁ。やっぱSSE3使ってみたいなぁ。
この夏に新しい石のAthlonでも買って試してみるか。

まあPrescottでも流れれば速いのかな?

49 名前:デフォルトの名無しさん mailto:sage [2005/08/01(月) 10:26:31 ]
>>48
うん、流れたときの速さは比べるものがないほどだと思う。
リアル128bitでバラバラに動くSIMDは強力。
レジスタ間movapsのレイテンシが6なことなど気にならない。

50 名前:デフォルトの名無しさん mailto:sage [2005/08/14(日) 19:40:00 ]
最悪だ・・・ノートのバッテリーが逝ってしまわれた・・・金が・・・
SanDiegoもVeniceもさようなら〜orz



51 名前:デフォルトの名無しさん [2005/08/25(木) 14:50:35 ]
sse3の使えない環境でsse3を使ったプログラムを走られたらどうなりますか?

52 名前:デフォルトの名無しさん mailto:sage [2005/08/25(木) 15:05:09 ]
Illegal Instruction例外で落ちます。

53 名前:デフォルトの名無しさん mailto:sage [2005/08/27(土) 19:01:02 ]
>>51
bochsという強力なエミュなら、どんな環境でもSSE,SSE2,SSE3,x64,3dnowなど
なんでもエミュレートできるぞ。
どんな環境でもって言うのはPowerPCでもSPARCでもってこと。

54 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 21:24:26 ]
人いない・・・

55 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 14:38:06 ]
ほんとにいませんねえ。
今までにSIMDで何を作ったことがあるか書いていくか?

56 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 16:24:49 ]
行列の掛け算・・・・

57 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 18:12:16 ]
いまから拡張命令使ってFirefoxを最適化してみようと思う。

58 名前:名無し募集中。。。 mailto:sage [2005/10/03(月) 18:45:09 ]
[word data1][word data2][word data3]・・・
[word data100][word data101][word data102]・・・
こんなふうに並列演算したいデータがメモリ上に並んでいない場合
data1とdata3とdata100とdata102を並列計算したい時って
pinsrw でデータを集める以外にうまいやり方ってない?
movq でメモリから64bit取り出してパックしたほうが早いかな?

59 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 19:58:56 ]
まずはデータ構造を見直せ。
すべてはそこからだ。

60 名前:名無し募集中。。。 mailto:sage [2005/10/03(月) 20:13:33 ]
データ構造はCCDのRAWデータだから仕方ないよ
[R][G][R][G]
[G][B][G][B] という配列(今回扱うのは1画素12bit)



61 名前:デフォルトの名無しさん mailto:sage [2005/10/04(火) 10:54:24 ]
SSEの整数命令って単にMMX命令のオペランドに
MMXレジスタだけじゃなくてSSEレジスタも使えるようになったってだけ?
しかも64ビットまでしか使えないって罠で利点はemmsなしでOKってだけ?

ここからチラシの裏
FirefoxのビルドしたらAthlonノートでやけどしたw
しかし最適化といってもどこから手を付けていいのやら。
テテさんとかどうやってんだろうね。

62 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 09:08:10 ]
>>61
SSE整数は128bit使ってるよ。
ただ、現状ではMMXが速いことが多いけど。

将来的には演算器が強化されてSSEの方が速くなるだろうし、
x64ではレジスタが倍の16本に増えるというメリットもある。

63 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 19:29:28 ]
SSE2じゃそうだろうけど初代SSEでもできんの?

64 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 08:58:39 ]
>>63
初代SSEとは、MMX2のことかい?

65 名前:デフォルトの名無しさん mailto:sage [2005/10/15(土) 08:03:38 ]
はやくSSEのスループットが1にならないかなー。

66 名前:デフォルトの名無しさん mailto:sage [2005/10/15(土) 14:31:23 ]
SSEの演算器だけ倍速作動とかw

67 名前:デフォルトの名無しさん mailto:sage [2005/10/16(日) 15:41:44 ]
ある程度トランジスタ割けば、SSEユニットを倍積めるんだろうか。
単純に演算器の数を倍にするの。

68 名前:デフォルトの名無しさん mailto:sage [2005/10/22(土) 10:59:10 ]
>>61
チラシの裏
MMXのmovqを使ってメモリコピーを高速化してるよ。
SSE系は使ってないみたい。

69 名前:デフォルトの名無しさん mailto:sage [2005/10/22(土) 14:11:26 ]
現状じゃ128bitのロード・ストアは遅いもんな。

Pen4だけは128bitの方が速いけど、
これも幅が広いから小回り効かなくて遅いのかな。

70 名前:デフォルトの名無しさん mailto:sage [2005/11/21(月) 01:03:24 ]
packed byteな乗算命令がなくて(´・ω・`)ショボーン



71 名前:デフォルトの名無しさん mailto:sage [2005/11/21(月) 10:15:15 ]
俺は多倍長データ加算用のSIMD命令がほしい。

72 名前:デフォルトの名無しさん mailto:sage [2005/11/23(水) 08:58:42 ]
勝手に3D NOW!!に対応してくれるコンパイラ無いかな。


73 名前:デフォルトの名無しさん mailto:sage [2005/11/23(水) 10:03:48 ]
>>72
対応って自動ベクトルか機能のことをいってるのか?
そうならこいつがあるが
ttp://www.codeplay.com/japanese/vectorc/feat-vec.html



74 名前:デフォルトの名無しさん mailto:sage [2005/12/11(日) 10:48:57 ]
CQ出版が15日に出す本が良本ならこのスレも
盛り上がってくれることを信じつつwktk


75 名前:デフォルトの名無しさん mailto:sage [2005/12/12(月) 01:08:17 ]
微妙な本だな。大体一章が10ページくらいのB5判だから、
基本的な触りくらいしか出てないようなヨカソ
インテルのマニュアルの方がよっぽど詳しいのではなかろうか。

76 名前:デフォルトの名無しさん mailto:sage [2005/12/12(月) 22:36:34 ]
>>75
そら純正マニュアルに敵う本なんてまずないだろ……

77 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 10:37:25 ]
早速買って来たよ。
SSE2の日本語+絵による解説は使えそう。


78 名前:デフォルトの名無しさん mailto:sage [2005/12/16(金) 04:01:41 ]
>>77
nyで

79 名前:デフォルトの名無しさん mailto:sage [2006/01/02(月) 01:04:22 ]
altivecはここじゃだめですか

80 名前:デフォルトの名無しさん mailto:sage [2006/01/05(木) 19:01:14 ]
SIMD命令を使ったトリッキーなコード、意外な使い方ってないですか。
簡単なやつでもいいので。

homepage1.nifty.com/herumi/adv/bbslog/bbs11.html
の498,519みたいな。



81 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 17:20:05 ]
iccでemmintrinつかってるんですが、
__m128 <-> __m128dのキャストをインラインアセンブリ
使わずにできます?
倍精度の仮数部の一部を整数演算で0クリアしたいんです。


82 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 17:45:45 ]
_m128iを引数とする関数で_m128dをそのままの形で使いたいって事でOK?

__m128d a;
__m128i b;
b = _mm_and_si128(*(__m128i*)&a,b);

83 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 17:53:53 ]
>>82
メモリアクセスするコードが生成されないか心配。

84 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 18:27:53 ]
んじゃこっち

union {
  __m128d a_d;
  __m128i a_i;
}
__m128i b;
(ry

85 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 22:13:20 ]
助言あんがと。
s=_mm_cvtpd_ps(d);
d=_mm_cvtps_pd(s);
てなことを
d=_mm_and_si128(d,mask);
てな感じで済ませたかったけど、
union使って書くと遅くなったんで最適化してくれないっぽ…
入力がfloatの範囲を越えても動かしたいんだけどなぁ


86 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 22:18:25 ]
インラインでガリガリ書くしかなくね?

87 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 23:44:17 ]
なるべくアセンブリは避けたかったですが、
inline __m128d round(__m128d d,__m128i mask){
__asm__ __volatile__ ("pand %1,%0" : "+x"(d) : "x"(mask));
return d;
}
で少し速くなりました。
どもども。


88 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 14:49:39 ]
720*480のBMPを640*480に縮小するのにMMXを使えないか思案中。

89 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 16:32:46 ]
640*480側で8ピクセル(24byte=MMX*3)ずつやればいいかな。
720*480側は普通に読むのと3byteずらして読むのをやって
掛け算で加重して・・・あ、MMXの乗算は16bitだけか。
どのくらいの速度になるだろ。

90 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 18:01:30 ]
久しぶりだったから配列のアドレスをmovでeaxに入れようと四苦八苦してしまったorz
今からbmpの構造を思い出そうとしている俺は完全に出遅れかな?



91 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 18:42:06 ]
>>90
つoffset

92 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 21:28:47 ]
>>90
つlea

93 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 22:07:42 ]
>88
バイリニアをMMXで実装するだけ。
しかも480で縦ライン固定なら1時間くらいで出来るんじゃね?

94 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 10:21:03 ]
//横のドット数が9と4の倍数の24bitBMPに対し、横を8/9に縮める
void resize(unsigned char *p,int w,int h)
{
 int i,j,k,n;
 n=w/9*h;
 for (k=0; k<n; k++){
  for (j=0; j<8; j++){
   for (i=0; i<3; i++){
    p[(k*8+j)*3+i]=((8-j)*p[(k*9+j)*3+i]+(1+j)*p[(k*9+j+1)*3+i]+4)/9;
   }
  }
 }
}
9ピクセル*n回の処理。まずCで書いて動作することを確かめた(もはや十分な速度だな・・・)。
MMXもこれと同じ方針で行く。

MMXには除算命令がないので乗算で代用。
精度も16bitだから、8bitの数値に対してはほとんど問題ない。

MMX版のコードは、次のように設定して次レスのコードをn回ループさせる。
short m[48]={8,8,8,7,7,7,6,6,6,5,5,5,4,4,4,3,3,3,2,2,2,1,1,1,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8};
n=w/9*h;
eax=m、esi=edi=p
mm5={4,4,4,4} ;=9/2
mm6={7282,7282,7282,7282} ;=10000h/9
mm7={0,0,0,0}

速度は、素通し(HDDのBMPをコピーするだけ)が156ms、MMXが175ms、C版が241ms。
720*480のBMPを5個変換するのにかかった時間(PentiumM)。
まあ、ディスクキャッシュにヒットしなかったら、ずっと遅くなるけど。
本来なら非SIMDアセンブラとの比較もしたいところだが、ここまで。
3個の出力を調べて、MMX版とC版の出力は全て一致していた。

95 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 10:21:34 ]
xor ecx,ecx
lp0:
movq mm0,[esi+ecx]
movq mm1,mm0
punpcklbw mm0,mm7
punpckhbw mm1,mm7
pmullw mm0,[eax+ecx*2]
pmullw mm1,[eax+ecx*2+8]

movq mm2,[esi+ecx+3]
movq mm3,mm2
punpcklbw mm2,mm7
punpckhbw mm3,mm7
pmullw mm2,[eax+ecx*2+48]
pmullw mm3,[eax+ecx*2+48+8]

paddw mm0,mm2
paddw mm1,mm3
paddw mm0,mm5
paddw mm1,mm5
pmulhw mm0,mm6
pmulhw mm1,mm6
packuswb mm0,mm1
movq [edi+ecx],mm0
add ecx,8
cmp ecx,24
jnz lp0

add esi,27
add edi,24
;MMXでバイリニアてのはどうやるの?

96 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 09:45:01 ]
>>90
変数の中身へのポインタを取得するとアセンブリでは
lea eax,[esp-12]
のようになるから、movは使えないのだね。

int *a;ならmov eax,aできても、int a[4];だとmov eax,aで氏んだからな。
あのときはけっこう悩んだ。

97 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 09:08:17 ]
SIMDで計算したいブロックを高級言語で明示できないかな。
たとえば、C言語風の妄想言語...
struct complex_t {
    float r, i;
};
foo() {
    complex c[4];
    VEC( float re : [ c[0].r, c[1].r, c[2].r, c[3].r ], float im : [ c[0].i, c[1].i, c[2].i, c[3].i ] ) {
        float t = re * re - im * im;
        im = 2 * re * im;
        re = t;
    }
とか書くと、VECブロックの中が自動的にSIMD命令で構成される。
( SIMD未対応のCPU向けのときは、通常の命令になる )
SIMDで実行するのだから、VECブロック中には分岐はかけず、
ループも固定回数ループだけ。

どう?この妄想言語。

98 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 11:51:13 ]
1つの構造体がメモリ上でバラバラになってるな。
それはいいとして、組み込み関数と演算子オーバーロードでよくない?

ただ、俺もそういう言語は欲しいと思っていた。
せっかくCPUに色々な命令があるんだから、命令が見える言語がいいよね。
そういう意味じゃCのシフト演算子とかナイスと思った。

99 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 19:29:54 ]
Intrinsics使えばインジャネ?

最終段で機械任せの最適化するなら、
そのままCでも構わないと思うけど。

100 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 21:01:05 ]
8bitビットマップ(グレースケール)から32bitビットマップへの変換を、MMX使って
実装しようとしているのですが、思っていたよりも早くならずに難渋しています。
 適当なやり方しているのは自覚しているのですが、同じく適当にCで書いたルーチン
と、リリース版の最適化コミで速度変わらずってのはかなり凹みました。
 どこかもっと最適化する場所があるのでしょうか? ご存じの方ご教授願います。

void testcopy( void *dst, const void *src, int size )
{
  int size2 = size >> 1;
  if(size2 != 0){
    __asm{
      mov edi, dst;
      mov esi, src;
      mov ecx, size2;
    loop_mp:
      movq mm0, [esi];
      punpcklbw mm0, mm0;
      punpcklbw mm0, mm0;
      movq [edi], mm0;
      lea esi, [esi + 2];
      lea edi, [edi + 8];
      dec ecx;
      jnz loop_mp;
      emms;
    }
  }
}









[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<141KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef