いてつくブログ

2ちゃんねるのスレッドをコピペしてまとめてみるブログ

演算

ニュース小学3年生の算数の問題 「9÷0=?」が話題に

1 : ヨーロッパヤマネコ(埼玉県):2012/11/28(水) 16:53:40.61 ID:rrw3xCK5P ?PLT(12000) ポイント特典

★「9÷0=0」? ある小学校で出された問題に「ちょっと待て」

突然ですが問題です。「9÷0=?」 これ、答えはいくつになるか分かりますか?

……うっかりゼロと答えてしまった方はいませんよね。答えは「割ってはいけない」
もしくは「答えなし」。少なくとも小中学校で習う算数・数学の範囲では、
「ゼロで割る」というのは「やってはいけないこと」とされており、もちろん答えが
ゼロというのも間違いです。ところが先日、Twitterで“「9÷0=0」と教えている学校がある!?”と話題になっていました。


ことのはじまりは、ブログ「スペビトピックス」が掲載した写真。息子(小3)の
宿題の添削をしていて、「9÷0=0」という項目を見つけた――というのが発端でした。
ちなみに問題集によれば、正解は「0」。スペビトピックスさんも、さすがにマルを付ける手が止まったそうです。

記事自体は2009年に書かれたものですが、ある人が「どうしたらこういうことが
起きるんだろうか」と記事をツイートしたところ、たちまち拡散。「9÷0=0と教えている小学校があるんですか!」
「(私のところでも)やってます。戸惑います」など、さまざまなコメントが飛び交い
大盛り上がりとなりました。一連のツイートは、Togetterにもまとまっており、
すでに17万view、4000リツイートを超えるなど大きな反響を呼んでいます。

単にこの問題が悪いだけなのか、それとも学校単位の問題なのかは不明ですが、
ともかく「ゼロで割ってはいけない」というのは数学の約束ごとのひとつ。
もしまわりで「9÷0=0」とおぼえている人がいたら、やんわりと正してあげてくださいね。

http://news.infoseek.co.jp/article/itmedia20121127028nl

5 : アジアゴールデンキャット(広島県):2012/11/28(水) 16:54:51.37 ID:Q6Ja7rCa0
そりゃ0人で物は分けられん

12 : オシキャット(新疆ウイグル自治区):2012/11/28(水) 16:57:24.21 ID:f/uHPjRh0
>>5
それじゃ説明になってない、もっと論理的に証明して下さい

18 : ヒョウ(大阪府):2012/11/28(水) 16:57:50.28 ID:xbgFfRce0
定義:「a=b×x」を満たすxが"唯一つ"存在する場合に「a÷b=x」を割り算とする

なんで0で割ったらダメかというと、b=0のとき
(1)a=0→「a=b×x」を満たすxが無数に存在する→この時のxは"定義されていない"
(2)a≠0→「a=b×x」を満たすxが存在しない→この時のxは"定義できない"

だからダメなのです

27 : ペルシャ(兵庫県):2012/11/28(水) 17:01:03.69 ID:RQQhsFBF0
1/0 = 0 が成り立つと

2/0 = 0 も成り立って

1/0 = 2/0

1 = 2 となって世界がヤバい。

150 : イリオモテヤマネコ(三重県):2012/11/28(水) 17:35:23.81 ID:8VtsC5pp0
>>12
理屈じゃないんだルールなんだよ

168 : ターキッシュバン(家):2012/11/28(水) 17:40:05.10 ID:lrbcnHbA0
限りなく∞に近づくが正解か?

226 : オシキャット(SB-iPhone):2012/11/28(水) 18:06:08.77 ID:2CDxzMSZi ?2BP(1212)

>>27
全然説明になってねーよ
乗算で同じことやってみろ


1×0 = 0 が成り立つと

2×0 = 0 も成り立って

1×0 = 2×0

1 = 2 となる

231 : ロシアンブルー(やわらか銀行):2012/11/28(水) 18:09:25.02 ID:JLmC4WoK0
>>226
アホか。
その3行目は普通に成り立ってるだろ。
3行目が真の時1=2という根拠になってない。マヌケ

296 : ジョフロイネコ(庭):2012/11/28(水) 18:47:17.83 ID:bFZL9mzxP
0で割ると無限大なんじゃなかったっけ?

301 : メインクーン(宮城県):2012/11/28(水) 18:50:11.24 ID:9r+7y8jJ0 ?PLT(13000)
>>296
んじゃ無限大に0をかけると9になるんかい?

312 : エキゾチックショートヘア(愛知県):2012/11/28(水) 19:02:19.06 ID:1TtfBbK00
>>301
0を除数とするケースは存在しないことくらい勉強してきてるよね?
ありえないんだよ。
学校では∞と教えている。

336 : スナネコ(やわらか銀行):2012/11/28(水) 19:23:29.24 ID:TjbaGlmJ0
0の0乗は0なのか1なのか未だに数学界の謎になっている。
物理学で光は波でもあり粒でもあると決められているから
0の0乗も「0と1を両方をあわせ持った性質の数」と定義すればいいのにネ。
そうすれば全員が納得する。

350 : ヨーロッパオオヤマネコ(岐阜県):2012/11/28(水) 19:49:15.60 ID:vEYUOdCx0
1/0.1
1/0.01
1/0.000000000000000000000000001
って0に近づけていったらどうなるって話だろ

354 : マーゲイ(茸):2012/11/28(水) 19:52:08.03 ID:nlceKMlH0
>>350
違うよ

356 : ヨーロッパオオヤマネコ(岐阜県):2012/11/28(水) 19:53:05.28 ID:vEYUOdCx0
>>354
何が違うんだバカ
数学的に説明しろ

358 : ベンガルヤマネコ(神奈川県):2012/11/28(水) 19:54:54.68 ID:9lwZPFER0
>>356
極限だろ、お前が言ってるのは
いくら近づけてもlim n→0 1/nだよ

359 : ヨーロッパヤマネコ(庭):2012/11/28(水) 19:59:16.40 ID:vFQak7JEP
>>358
1/0とそれの違いが分からないバカのなんと多いことw

ちなみにlim x→0 1/x = +∞ と思ってるバカも大杉

362 : ベンガルヤマネコ(神奈川県):2012/11/28(水) 20:01:33.05 ID:9lwZPFER0
>>359
聞きたいんだけど、正の方向から近づけたら+∞、負の方向から近づけたら-∞に発散するで合ってるよね?違う?

394 : セルカークレックス(福井県):2012/11/28(水) 20:45:31.56 ID:IdTyo1Da0
お前ら知ってるか。
大抵の電卓は256÷16の計算ができない。
=を押しても答えが出ないのだ。

442 : サビイロネコ(富山県):2012/11/28(水) 21:51:10.43 ID:n7NssW+I0
この感じだと、ここにいる奴らには、実数の0乗が1になることも知らない奴もたくさんいるんやろな
同じ人間と思いたくない

471 : 黒(禿):2012/11/28(水) 22:15:54.94 ID:Rs2f2UJEi
もしかして、0は掛けてもダメなんじゃない?

477 : アビシニアン(チベット自治区):2012/11/28(水) 22:24:04.53 ID:3/dnliUl0
検算(確かめ算)をしてみると、理解しやすい。
例えば「10÷2=5」を確かめる場合、「5×2」を計算して「10」になるから正しいと言える。

じゃぁ、今回の「9÷0=0」を確かめてみよう。「0×0」を計算して「9」になるか?
言い換えれば、0にに何をかけたら9になるんだ?

X(エックス)に0をかけて9になることはあり得ない。
だから、「9÷0=0」の数式は 明らかに間違いだ(成立しない)と言い切れる。

低学歴の俺でもわかるわw

481 : ボルネオヤマネコ(東京都):2012/11/28(水) 22:26:08.27 ID:3IKcbnDV0
>>477
それだと「0÷0」が困るだろ?

483 : ロシアンブルー(やわらか銀行):2012/11/28(水) 22:27:21.56 ID:JLmC4WoK0
>>481
同じでしょ

485 : ボルネオヤマネコ(東京都):2012/11/28(水) 22:29:36.46 ID:3IKcbnDV0
>>483
同じ????

490 : ベンガルヤマネコ(神奈川県):2012/11/28(水) 22:33:21.75 ID:9lwZPFER0
>>485
0に何を掛けても0になるから同様。解が一つに定まらなければ除算の定義にそぐわない

498 : ボルネオヤマネコ(東京都):2012/11/28(水) 22:36:48.45 ID:3IKcbnDV0
>>490
>>471の「9÷0」を「0÷0」に変えて読んでみて。
それでも>>471が正しいと言うなら、それ以上コメントはないわ。

502 : ボルネオヤマネコ(東京都):2012/11/28(水) 22:37:44.15 ID:3IKcbnDV0
>>498
訂正>>471>>477

506 : ロシアンブルー(やわらか銀行):2012/11/28(水) 22:41:17.50 ID:JLmC4WoK0
>>502
だから、0/0=0でも0/0=1でも何でも答えに好きな数字入れて確かめ算したら答えは0になっちゃうだろ。

だから0/0の答えは0と定まらないって話だろうよ。定まらないんだから、定義できないだろ。
それだと「0÷0」が困るだろ?(キリッじゃねーんだよ。

508 : ベンガルヤマネコ(神奈川県):2012/11/28(水) 22:42:07.20 ID:9lwZPFER0
>>498
>>18読めよ

0×x=0となるxは不定だから0の0除算も定義されないんじゃないか?

511 : ボルネオヤマネコ(東京都):2012/11/28(水) 22:43:48.34 ID:3IKcbnDV0
>>506
お前の勝手な解釈はどうでもいいから
>>477に「0÷0」で置き換えて変だと思わないのか?

514 : ボルネオヤマネコ(東京都):2012/11/28(水) 22:46:22.80 ID:3IKcbnDV0
>>508
ほんとアホだなあw
そんなんわかっている。
>>477の文について、9を0に置き換えたら変だろって言ってるだけだ。

517 : ベンガルヤマネコ(神奈川県):2012/11/28(水) 22:48:10.12 ID:9lwZPFER0
>>514
確かにそのまま入れたら変だがその辺は機転をきかせろよ

593 : サーバル(静岡県):2012/11/28(水) 23:57:51.82 ID:yxSV0i6R0
この人によると定義できないが答え
http://kurobe3463.blogspot.jp/2005/04/theoretical-reason-impossibility-of.html

597 : スノーシュー(埼玉県):2012/11/29(木) 00:02:09.21 ID:X7aH+OJN0
>>593
>「割ってはいけない」ではなく「割れない」としか言いようがない.

この一言に要約されてるけど、説明も分かりやすい。

602 : スノーシュー(埼玉県):2012/11/29(木) 00:05:50.22 ID:X7aH+OJN0
>>597
と思ったけど、後半難しかった;
でも「割れない」で間違ってなかった

618 : シンガプーラ(やわらか銀行):2012/11/29(木) 00:34:43.78 ID:djAEL0Do0
>>597
>>602
「定義されてない演算はできない」=「定義されてない演算はやっちゃいけない」とも言えるだろ。
なぜ「『割ってはいけない』ではない」と言い張るのか意味不明。

621 : オセロット(家):2012/11/29(木) 00:38:41.08 ID:IaWS9MvK0
>>618
割ってもかまわないからだろ

でも存在しない数では割れないよってこと

626 : シンガプーラ(やわらか銀行):2012/11/29(木) 00:43:14.84 ID:djAEL0Do0
>>621
> 割ってもかまわないからだろ
>
> でも存在しない数では割れないよってこと

その解釈は間違ってるよ。「割ってはかまわない」のではなく、やはり「割ってはいけない」。

その具体例を次に示すよ。

(x^2-1)/(x-1)=0 を計算してみ?

「割ってかまわない」場合と「割ってはいけない」場合で計算結果が違ってくる。
前者なら矛盾を起こすが、後者ならちゃんと計算できる。

632 : オセロット(家):2012/11/29(木) 00:57:11.49 ID:IaWS9MvK0
>>626
言葉のレベルと数学のレベルを同じレベルで捉えるからおかしくなんだよ
論理のレベルがちがう。

後者でも答えは出ないわけじゃん?
でも「割っても構わない」というメタの視点から「割ってはいけない」計算をした結果「割れない」の

「割っても構わない」のは主体で、「割れない」のはオペレーション。
わからんか?

633 : シンガプーラ(やわらか銀行):2012/11/29(木) 00:59:24.04 ID:djAEL0Do0
>>632
> 後者でも答えは出ないわけじゃん?
いや、ちゃんと答えは出るよ。

> でも「割っても構わない」というメタの視点から「割ってはいけない」計算をした結果「割れない」の
いや形式的には割れるんだって。
それではまずいことが起こる場合があるから「割ってはいけない」という禁則を設けてるだけ。
>>626の例を実際に計算してみれば分かる。

652 : イリオモテヤマネコ(広島県):2012/11/29(木) 01:45:54.29 ID:j26ear6i0
除算は乗算の逆演算なんだから、乗算で考えればわかるだろ。
教師は自分が教えてることをわかってないのか。

24÷6=?

この問題の答えを求める時に、「ろくしにじゅうし」だから4って
答えを書くんだって教えてるんじゃないのか?

だったら9÷0=?

0に何を掛ければ9か?って聞かれて0って答えるの?ばかなの?
「そんな数はない」だろ?
「0には何を掛けても0」だって自分で教えてるんじゃないか。
9÷0=?の答えは0でも∞でもない。
「割ってはいけない」でもなければ、「割らない約束」でもない。
答えは「そんな数はない」。

バカ教師はクビにしろ。

654 : 茶トラ(大阪府):2012/11/29(木) 01:49:15.65 ID:Hm3zUPMk0
除算が非可換の場合はどうするよ?

655 : ライオン(関東地方):2012/11/29(木) 01:49:57.27 ID:KYx0LHKuO
>>652
それは逆演算という観点から捉えなくてはいけないと決めつけてるだけだろ

660 : イリオモテヤマネコ(広島県):2012/11/29(木) 02:00:27.02 ID:j26ear6i0
>>655

逆演算と捉えないんだとしたら、なんで24÷6=4なんだ?
おまえ頭の中でどんな計算してるんだ?
6×4は24だからって計算してないか?

てか、数学の世界では「除算」は「乗算」の逆演算と捉えるべきだぞ。

662 : シンガプーラ(やわらか銀行):2012/11/29(木) 02:04:40.95 ID:djAEL0Do0
>>660
> てか、数学の世界では「除算」は「乗算」の逆演算と捉えるべきだぞ。

そんなことはない。24から6を何回引けるかという独立した演算だと捉えてもいい。(その場合、
その結果が乗算の逆演算と一致することは証明すべき命題となる)

666 : イリオモテヤマネコ(広島県):2012/11/29(木) 02:07:04.92 ID:j26ear6i0
>>654

なにをいってるんだ?
除算は非可換だろ。

667 : ボブキャット(埼玉県):2012/11/29(木) 02:07:16.98 ID:CRmYVQwo0
0は加法単位元、すなわち任意の体の元(実数または複素数としてよい)xに対して
x+0=0+x=x
を満たすとする。このとき
0*x=(0+0)x=0*x+0*x
より
0*x=0
を得る。すなわち
0*y=1(乗法単位元)
となるyが存在しない。
従って、0は乗法逆元を持たないから0^(-1)は存在しない。

671 : シンガプーラ(やわらか銀行):2012/11/29(木) 02:19:57.14 ID:djAEL0Do0
>>667
その論理には穴があるな。

分配法則が常に成り立つという根拠は?

0*x=(0+0)x=0*x+0*x は「xが0の乗法逆元でない場合に成り立つ」という制限を設ければ、

0*y=1となるyを定義することも可能。

674 : ボブキャット(埼玉県):2012/11/29(木) 02:23:46.99 ID:CRmYVQwo0
>>671
>分配法則が常に成り立つという根拠は?
環の定義に依る

>0*x=(0+0)x=0*x+0*x は「xが0の乗法逆元でない場合に成り立つ」という制限を設ければ、
>0*y=1となるyを定義することも可能。
例を挙げて

675 : シンガプーラ(やわらか銀行):2012/11/29(木) 02:29:45.64 ID:djAEL0Do0
>>674
> >分配法則が常に成り立つという根拠は?
> 環の定義に依る
それじゃトートロジーだなw

> >0*x=(0+0)x=0*x+0*x は「xが0の乗法逆元でない場合に成り立つ」という制限を設ければ、
> >0*y=1となるyを定義することも可能。
> 例を挙げて

例も何も、加法単位元として、x+0=0+x=xの性質を満たす量であるゼロ「0」を定義したのと同様に、
乗法逆元として、0*α=α*0=1の性質を満たす量である乗法逆元「α」を定義すればいいだけ。

677 : イリオモテヤマネコ(広島県):2012/11/29(木) 02:33:21.33 ID:j26ear6i0
>>662、663

ああすまん。
論点ずれてた。

>てか、数学の世界では「除算」は「乗算」の逆演算と捉えるべきだぞ。

ここだよな。
確かに、おまえの言うとおり、減算を繰り返し適用することにより、除算
を捉えることができるから、「除算」は「乗算」の逆演算と捉える"べき"
ってのは間違いだな。

俺が言いたかったのは、小学校で教師が除算を教えるときに、乗算
の逆演算として捉えた観点からの教え方をしているわけで、きちんと
その観点だということを理解してれば、9÷0=0なんて答えは出てこない
だろってこと。

683 : シンガプーラ(やわらか銀行):2012/11/29(木) 02:40:10.79 ID:djAEL0Do0
>>677
> 俺が言いたかったのは、小学校で教師が除算を教えるときに、乗算
> の逆演算として捉えた観点からの教え方をしているわけで、きちんと
> その観点だということを理解してれば、9÷0=0なんて答えは出てこない
> だろってこと。

そもそも本当にそんなこと習った人や、教えている先生なんているのかな。
嘘くさいんだが。「9÷0=0」と習った覚えがあると言ってる人ってここも結構
いるようだけど、忘れてるか授業聞いてなかっただけじゃないのかな。
実際にはちゃんと「0で割るのはルール違反」と教えられているはずだと思うが。
指導要領など具体的なソースがあればいいが。

684 : ボブキャット(埼玉県):2012/11/29(木) 02:41:10.99 ID:CRmYVQwo0
>>675
>それじゃトートロジーだなw
はい?俺が>>667で言ってるのは体の話だから何も問題ないだろ
実数全体が環になること、特に分配法則を満たすことは、例えば1辺がaの正方形を適当に分割して面積比較でわかる

>例も何も、加法単位元として、x+0=0+x=xの性質を満たす量であるゼロ「0」を定義したのと同様に、
>乗法逆元として、0*α=α*0=1の性質を満たす量である乗法逆元「α」を定義すればいいだけ。
で、それは体になるの?

688 : スノーシュー(埼玉県):2012/11/29(木) 03:00:39.73 ID:X7aH+OJN0
数学の手法で定義する抽象空間には存在します、っていう話なら
なんとなくの理解はできるし、尊重はする。

数学的技巧も素晴らしいと思う。

でも、実在しないなら、やっぱり「割れない」でいいと思う。

689 : イリオモテヤマネコ(広島県):2012/11/29(木) 03:01:07.46 ID:j26ear6i0
>>683
いやいや、もちろん「除算」は「乗算」の逆だからなんていわれてないぞ。
小学校で除算教えるときに、筆算で教えるじゃん。

 ___
6) 24

この時、「ろくしにじゅうし」だから24の上に4って書いて・・・って
教えるだろ?
これがまさに、乗算の逆演算の観点だろって言いたいの。
そうであれば、>>652だろって。

702 : マンチカン(家):2012/11/29(木) 03:44:00.40 ID:nyzHsW4z0
今二十歳だけど普通に0って習ったぞ。今は違うのか?


http://hayabusa3.2ch.net/test/read.cgi/news/1354089220/l50/../人気ブログランキングへ


PC等【C++】高速化手法【SSE】

1 :デフォルトの名無しさん:2005/10/27(木) 02:55:36
C++やインラインアセンブラ、SSEなどによる高速化の手法
について語りましょう。

178 :デフォルトの名無しさん:2009/01/07(水) 23:00:55
メモリ(バキューン!)とかを考慮すると構造体より配列のほうが高速?

179 :デフォルトの名無しさん:2009/01/08(木) 00:02:43
>>178
同じ。

185 :デフォルトの名無しさん:2009/01/09(金) 14:29:17
>>179
うほ?
>>178の意味がいまいち分からんが、
char array[0x100];

struct{char value;} array[0x100];
だったらレジスタサイズにパディングされる分、構造体の方が早くね?
ちなみに、同じ事だが容量気にして構造体のなかでshortとか使うと
パデイング入るんでメモリに無駄が発生する。
まぁ、パディングを知っていれば無駄を防ぐこともできるけど。

189 :デフォルトの名無しさん:2009/01/11(日) 01:50:19
>>185
> struct{char value;} array[0x100];
> だったらレジスタサイズにパディングされる分、構造体の方が早くね?

pragmaやattributeでパックしない限りpaddingは入らないだろ。

191 :,,・´∀`・,,)っ-●◎○:2009/01/11(日) 06:05:36
>>189
構造体やその配列の場合、パディングが入る。
デフォルトが4バイト単位だったかな?

360 :デフォルトの名無しさん:2009/09/08(火) 20:07:19
だんごじゃないけどi5はi5だよ。それ以上でもそれ以下でもない。

361 :デフォルトの名無しさん:2009/09/08(火) 20:13:34
>>360
おめーみたいなカスには聞いとらん失せろゴミが
ダンゴさんマダー?

363 :デフォルトの名無しさん:2009/09/08(火) 21:25:40
>>361
ちょwだれww
ほれ、なんかcore2の時とかこれはいいぜーとかなんか詳しく言ってたような気がしたから
i7なりi5なりのアーキテクチャ面からの意見を聞いてみたかったんだ

382 :デフォルトの名無しさん:2009/09/10(木) 00:35:11
おい!テーブル使わん言ったじゃねえかよ。氏ねカス。

387 :デフォルトの名無しさん:2009/10/08(木) 03:33:43
unsigned int mod6(unsigned int m){
unsigned int a = 0;
static unsigned int x[] = {0,2,4,0,2,4,0,2,4,0,2,4,0,2,4,0,2,4,0,2,4,0,2,4};
__asm{
mov eax, m
test eax, 1
jz Mod3
inc a
Mod3:
shr eax, 1
lea ebx, x
mov edx, eax
and eax, 0000ffffh
shr edx, 16
add eax, edx
mov edx, eax
and eax, 0000003fh
mov ecx, edx
and edx, 00000fffh
shr ecx, 12
shr edx, 6
add eax, ecx
add eax, edx
mov edx, eax
and eax, 0000000fh
shr edx, 4
add eax, edx
mov edx, x[eax*4]
add a, edx
}
return a;
}

399 :デフォルトの名無しさん:2009/10/08(木) 15:58:42
逆数乗算で商を求めて元の値から引いたほうが速い
今のCore MAでは整数乗算は浮動小数除算機と兼用してて
非除数 - (除数×小数点以下切り捨てた商)

まあベンチ取ってみればわかるがコンパイラの吐くコードにも勝てんと思う

401 :デフォルトの名無しさん:2009/10/08(木) 17:45:39
static??const??int??rcp6??=??1.0??/??6.0??*??std::pow(2.0,16.0);
int??x??=??255??-??((255??*??rcp6)??>>??16)??*??6;

確かにこれで十分な気がするし、>>387より速そうだ。


414 :デフォルトの名無しさん:2009/10/09(金) 01:24:41
>>387
inline unsigned int mod6(unsigned int a){
 unsinged int b = (a >> 3) + (a >> 5); // /6
 unsinged int c = (b << 1) + (b << 2); // *6
 return a - c;
}

456 :デフォルトの名無しさん:2009/10/22(木) 03:07:47
C/C++でメモリプール(int, doubleなど様々な型が共存)を作り、
メモリプール内部でメモリの詰め直しを行って最適化しようと試みています。

入門書+α(boostがわかるぐらい)なので、
キャッシュやメモリに関する特殊なことは全然わかりません。
何か気をつけなければならないことや忠告があれば教えてください。

488 :,,・´∀`・,,)っ-○○○:2009/10/28(水) 04:46:10
for (i = 0; i < N; i+=4) {
  sum1 += A[i];
  sum2 += A[i+1];
  sum3 += A[i+2];
  sum4 += A[i+3];
}
sum = sum1 + sum2 + sum3 + sum4;

っていうか組み込み関数使えよ

498 :デフォルトの名無しさん:2009/10/29(木) 08:44:26
>>488
これってNがわかっていないとコンパイラはやってくれないよね?
ICCだと出来るのかな?
GCCではベクトル化してくれなかった。

539 :デフォルトの名無しさん:2011/01/28(金) 11:43:56
x86は浮動小数点が弱くて仕方がないからなあ
8087のコプロセッサの頃からの負の遺産を引きずっている
でもL1/大容量L2キャッシュを媒介にする事によって相当克服して来てはいるんだけどな
PowerPCなどにどうしても勝てない

596 :デフォルトの名無しさん:2011/05/30(月) 10:20:14.97
結論から言うとメモリの転送がボトルネックです。
書き出しのアライメントを揃える事とstreamを使う事で何割かは改善出来ますが、基本的に速く出来ません。

最適化とは遅い部分を探し出す事に他なりません。
安直にSSEとかマルチプロセッサにしようと思わず、真にボトルネックを見つけられるようになりましょう。

真に遅い部分が分かったなら、平均化フィルタと何が違うのか、どうしてもう速く出来ないのかが理解出来るようになります。

598 :デフォルトの名無しさん:2011/06/13(月) 15:11:06.75
>>596
メモリの転送がボトルネックなのか、演算部分がボトルネックなのかは
どうやって判断すればいいのですか?つまりどこを見たらよいのか。
あるいはあなたはどうやってますか?
ツールとか使うのでしょうか?

618 :デフォルトの名無しさん:2011/07/02(土) 22:44:49.03
mapの方がアライメントされてないんじゃない?

619 :デフォルトの名無しさん:2011/07/02(土) 23:38:54.68
std::pair<int, hoge>からaligned_stl::pair<int, hoge>へのコードがバグってるんじゃないの

620 :618:2011/07/03(日) 00:21:26.44
適当な事書いたと思ったけど、std::mapにカスタムアロケータでいけるっぽい
http://ideone.com/sOWl6



621 :デフォルトの名無しさん:2011/07/03(日) 02:45:36.94
>>618
mapの方は、__declspec(align(16))みたいなことはしてませんが
カスタムアロケータを渡しており、カスタムのpair(aligned_stl::pair)を使うように指定してます。

>>619
わかりづらくてすみませんorz
std::pairは一切使っておらず、aligned_stl::pairのみです。
make_pairもaligned_stl::pairを返します。

>>620
ありがとうございます、Win7 64bitのVC2008Expressで動かしてみましたが
カスタムアロケータのc.insertで、Hoge()の引数なしのコンストラクタで落ちます(x_ = static_x)
Hoge hoge;
c.insert( ::std::make_pair<int,Hoge>(i, hoge) );
とやると、make_pairのところのコピーコンストラクタで落ちます( x_ = src.x_)。
なので、前回書いたのと同様に
Hoge hoge;
std::pair<int, Hoge> pairArg(i, hoge);
とやってからpairArgを渡すと落ちませんでした(c.insertのみ。d.insertは落ちる)。

どうもpairに関してはアラインメント指定しなくても、中のメンバが
アラインメント指定されていれば問題ないようですね(アロケータだけでよい?)。
もうちょっと試してまた報告します。
ただ、2008だとアラインメント指定が一時オブジェクトに対して効かないと考えたほうが
いいのかもしれませんね(´・ω:;.:...  (インライン展開された場合は除く)
ありがとうございました。

638 :デフォルトの名無しさん:2011/07/05(火) 22:56:13.54
余分なカッコが多すぎるコードってみにくくて嫌いだ。

if (a == 0 && b == 0 || c == 0 && d == 0)

if ((((a == 0) && (b == 0)) || ((c == 0) && (d == 0))))

この二つだと上の方がはるかに見やすいと個人的には思うが、
見やすさを優先してカッコをつけるとか言って下のように書く人がいる。


649 :デフォルトの名無しさん:2011/10/10(月) 19:26:30.72
指定桁数で四捨五入する以下の関数の実行速度を上げたいの。
(valueは0~9999、digitsは0~5が保証される)
SSE使って高速化頼む。

double NormalizeDouble(double value, int digits) {
  static double t0[] = { 1, 10, 100, 1000, 10000, 100000 };
  static double t1[] = { 1, 0.1, 0.01, 0.001, 0.0001, 0.00001 };
  return (int)(value * t0[digits] + 0.5) * t1[digits];
}

652 :デフォルトの名無しさん:2011/10/10(月) 19:49:57.12
>>649
最適化スレで終了宣言してからにしろよ

653 :デフォルトの名無しさん:2011/10/10(月) 19:50:50.26
でもベクトル化で少しは早くなるわよ

664 :デフォルトの名無しさん:2011/12/17(土) 22:41:12.80
signed shortの配列に
floatもしくはdouble型の乗算をして
クリップ処理をほどこし
signed shortの配列に戻すのを
SSEにしたいのでやってください


これ

signed short s[100];
float f
init a;

for (a=0;a<100;a++)
s = s[a] * f;

665 :デフォルトの名無しさん:2011/12/17(土) 23:06:34.33
それ、どう考えても実数型⇔整数型のコストがでかすぎる。
たった100件でいいなら実数で持てないの?

679 :デフォルトの名無しさん:2011/12/19(月) 02:15:44.43
初めてSSEに触れるので、まずは簡単なコードを作成してみたのですが、
SSEを使わないほうが40倍も速いという驚愕の結果が出ました。
何が間違っているんでしょうか??

コンパイラ:VC++2005(Releaseモード、浮動小数点モデル:FAST)

float* f4pakAdd( float* pfA, float* pfB )
{
  _declspec( align( 16 ) ) static float fC[ 4 ];
  
  _asm
  {
    mov ebx, pfA
    movaps xmm0, oword ptr [ebx]
    mov ebx, pfB
    movaps xmm1, oword ptr [ebx]
    addps xmm0, xmm1
    movaps fC, xmm0
  }
  
  return fC;
}

呼び出し側

for( int i = 0; i < 10000000; i++ )
{
  pfC = f4pakAdd( fA, fB );
}

682 :デフォルトの名無しさん:2011/12/19(月) 02:34:54.14
パイプライン化したコードでもないし、スタックチェックが行われている気がするが。
逆アセ確認したかい?

707 :デフォルトの名無しさん:2011/12/23(金) 11:26:47.88
どんな変数も問答無用でアライメント16にするようにコンパイルする設定があれば
面倒な記述を減らせると思うんですが、何かデメリットあるんでしょうか?
メモリの隙間ができて勿体無いとかあるかもしれませんが、メモリ量の多い昨今、
それほど問題にならないのでは?と思います。
むしろアライメントすることでメモリアクセスの冗長さを減らせて帯域を節約する効果も
あって一石二鳥ではと思うんです。

708 :デフォルトの名無しさん:2011/12/23(金) 11:59:03.43
gccだと-mpreferred-stack-boundary=4がデフォルトだから既に16バイトアライメントだよ
構造体の詰め物は互換性もあるし難しいじゃないか

710 :,, ・´ ∀ `・ ,,)っ-○○○:2011/12/23(金) 12:41:37.02
>>707
なにそれ君いまだにPS3向けのゲームとか組まされてるわけ?

711 :デフォルトの名無しさん:2011/12/23(金) 15:57:24.48
>>708
glibcのmallocは8バイトだよ

>>710
SandyBridgeでもアラインメント取れてないと遅いでしょ

713 :デフォルトの名無しさん:2011/12/23(金) 17:19:17.60
>>711
Nehalem以降はmovups/dquもペナルティ無く使えるでしょ
まあ結局Core2以前も考慮するとコード振り分けるから労力は変わらないのだけれど...

714 :707:2011/12/24(土) 02:12:26.59
すみません、自分は日曜プログラマレベルで、対象CPUはx86、環境はVC++です。
VC++の設定を見ていると、「構造体メンバのアライメント」というのがあって16バイトアライメントを選べるようになってました。
同様に通常の変数もアライメントできる設定があるかと思い探しましたが見付かりませんでした。

715 :デフォルトの名無しさん:2011/12/24(土) 02:18:17.32
どう考えてもこれ以上削れないってくらいの手書きインラインアセンブリコードに対し、
C記述版をVC++のReleaseモード(最適化O2)でコンパイルしたもののほうが1.3倍速かったです。
生成されたアセンブリを覗いてみたところ、

変数 * 3

というコードを

lea edx, DWORD PTR [eax+eax*2]

としていてびっくりしました。
これって、アドレス演算を行うローダ(専用の演算器?)を使うことで、
通常のALUと並行して演算(スーパースカラって言うんでしたっけ?)し
高速化しているということなんでしょうか??

716 :デフォルトの名無しさん:2011/12/24(土) 02:34:46.72
>>714
__declspec(align(N))

717 :707:2011/12/24(土) 02:44:05.59
>>716
ありがとうございます。
それは知っているんですが、>>707でも書いた通り、
そういった記述をわざわざせずとも、自動で全てアライメントしてくれるような設定があればイイのでは?
と思った次第です。

しかし、上でも仰られたように、互換性の問題があったりで難しいのでしょうね・・・
でも二重インクルード防止の「#pragma once」のように、互換性を考慮しない機能があったりするくらいですから、
自分のようにずっとVC++しか使わない人間を対象にそういうオプションが用意されていても良いのではと思いました。

733 :デフォルトの名無しさん:2012/03/09(金) 12:53:25.77
unsigned int maxpos(unsigned int src[256])
{
unsigned int i, m = 0;
for(i = 1; i < 256; i++)if(src[m] < src[i])m = i;
return m;
}
これをSSEで高速化する方法があれば教えて下さい

739 :デフォルトの名無しさん:2012/03/11(日) 00:41:15.69
>>733
画像とか統計の基礎だな。疑似コードで書くとこんな感じだ

maxpos(src[256]) {
pos = {0, 1, 2, 3};
for(i=0; i<256; i+=4) {
 s=load(&src[i]);
 isGT=maxVal<s;
 maxVal=isGT&s | ~isGT&maxVal;
 maxPos=isGT&pos | ~isGT&maxPos;
 pos += 4;
}
return max_position(
 maxVal[0], maxPos[0],
 maxVal[1], maxPos[1],
 maxVal[2], maxPos[2],
 maxVal[3], maxPos[3]);
}

762 :,, ・´ ∀ `・ ,,)っ-○○○:2012/03/14(水) 07:23:58.09
packed unsigned intの比較(マスク生成)だけど、両項のMSBを反転してからpcmpgtdするより
psubd + psradのほうが速いかもしれない

768 :デフォルトの名無しさん:2012/03/21(水) 23:53:20.16
P6,P2,P3,P4はforwardならnot taken backwardならtakenがデフォルト
P4はPrefixでヒントを出せる
PM,Core2はランダム
ソースはAgner

775 :デフォルトの名無しさん:2012/03/24(土) 21:41:50.71
そう思ってくれるのはいいが、間違いの指摘と
実際はどうなってんのか答えてくれ
批難だけの回答はいらん。

778 :デフォルトの名無しさん:2012/03/24(土) 21:52:06.49
>>775
じゃあ間違いを指摘してやる。

>大概returnやthrowが行われるからifをすっ飛ばせば速いのは解る。
前方への条件分岐は、「分岐しない」と予測される、とオマエ以外の全員が言っている。
if (xx) return
で「すっ飛ばせば云々」なんて、理解していないまま「わかったつもりになってるだけ」の証拠。

>今のCPUは分岐ヒントとか投棄とかあって単純じゃないんだろ
ヒントはともかく、投機はまさに「投機実行するために分岐予測をする」のであって
「投機実行もあるから分岐予測が複雑になる」はナンセンス。
もちろん、エンプラ系/VLIW系では「分岐の有無の両経路を実行する」なんてのもある(らしい)が
一般的とは言いがたい。

779 :デフォルトの名無しさん:2012/03/24(土) 21:59:34.64
>>778
内容じゃなく国語的に誤解されてるな。

>前方への条件分岐は、「分岐しない」と予測される、とオマエ以外の全員が言っている。
if( xx ) throw xxx;
throwなんて実行するケース殆ど無いんだから基本if実行しないってのは同じ話。
矛盾してないでしょ。

まず分岐予測が複雑になってるって話はしてないよ。
投棄実行については投棄実行を考慮した上での静的予測方法があるでしょという話。

780 :デフォルトの名無しさん:2012/03/24(土) 22:04:11.41
>>779
だから、ifの内部は「実行すると予測される」んだよ、バーカ

782 :デフォルトの名無しさん:2012/03/24(土) 22:06:41.25
せめて正しい漢字使えよ。

一度なら単なる変換ミスとして納得できるけど
繰り返しているってことは、別の意味に捉えているとしか思えない。

783 :デフォルトの名無しさん:2012/03/24(土) 22:09:32.88
>>780
お前バカだろ
みんなアセンブリ前提で言ってんだよ

jze label   if() {
・・・処理・・・
labeli     }


789 :デフォルトの名無しさん:2012/03/24(土) 22:48:33.55
投棄実行については誤解してたわ。
2つの分岐を両方実行して実際実行対象にならなかった方の結果を破棄するものだと思ってた。

792 :デフォルトの名無しさん:2012/03/24(土) 23:01:04.27
一応。

突然returnやthrowが出てくるのが
if (xx) return
という意味じゃないか、というのも勝手に俺が頭の中で補って想像しただけで
実際には何の説明も無く(ifの多くがreturnやthrowというのにも同意しにくい)
唐突な「rerturnやthrow」「すっ飛ばす」を必死に理解しようとしたのがそもそもの間違いかもね。

794 :デフォルトの名無しさん:2012/03/24(土) 23:04:39.09
>>792
>>779で補足だしてるだろしつこいわ

803 :デフォルトの名無しさん:2012/03/25(日) 16:12:43.94
インテルの最適化マニュアルだと
>インテルPentiumM??プロセッサー、インテルCoreSolo??プロセッサー、インテルCoreDuoプロセッサーは、
>ジャンプの向きに従った条件分岐を静的には予測しない。これらのプロセッサーでは、
>すべての条件分岐は、最初に発生したときでも動的に予測される。
と書いてあって、wikiで調べたらPenM以降は広域分岐予測を取り入れた関係で静的予測はしなくなったみたいだね
http://ja.wikipedia.org/wiki/%E5%88%86%E5%B2%90%E4%BA%88%E6%B8%AC

>>768
>PM,Core2はランダム
というよりも、「前に実行した別の分岐命令の結果も影響する」とした方が適切みたいだ

分岐予測に関して
http://news.mynavi.jp/column/architecture/index.html
の第167回からの解説が参考になるよ



http://toro.2ch.net/test/read.cgi/tech/1130349336/l50/../人気ブログランキングへ

学ばないブログ
忍者AdMax
記事検索
最新コメント
QRコード
QRコード
  • ライブドアブログ