一応自宅にはいろんな動作検証用にWindowsとLinuxの両方のOSのサーバー(WindowsはXPだけどLinuxはFedora)があるのですが、
なんかLinuxサーバーの動作がおかしいということに。電源をつけて放置しておいてしばらくたってリモートでアクセスしても応答がない・・・。
で、手元に持ってきて電源をつけてみると以下の症状が。
- 電源をつけてしばらくすると(BIOSの表示中でも)勝手に電源が落ちる
- うまく入った場合でもLANを接続するとリンクアップとリンクダウンが継続して発生している
・・・なんじゃこりゃ?
ま、結論としては、電源の経年劣化による出力不足で電圧が足りなくなってシャットダウンしている、とわかりました。
さすがに6年前の電源+520W電源でXeon(Pentium4時代の)x2+AGPだと出力が足りなくなるかもな~と思いました。
LANの方は手元にあったLANカードを追加してそちらに回してとりあえず解決させました。
電源交換も一苦労で、買ってきた電源と裏のパネルのねじの位置が合わない・・・
プレートは一度外して回転できるので回して解決かと思いきや、なんか回転するとプレートの出っ張りの部分に電源+HDDのマウンタが接触してはまらない・・・。
金属加工をおこなって出っ張り部分を曲げて何とか解消して押さえました・・・。
ということで、今では元気に復活してがんばってくれています。
今日のプログラムのお題は、「高速なmemcpyってなんだろう?」です。
通常、VC++で使用されるmem系の処理(memcpy,memset,memmove)はアセンブラレベルで最適化されているで、基本的には勝てません。
ただし、特殊な条件、特に「SSE2などの128bitレジスタを使用して転送する」という状態なら勝つこともできるはずです。
これについてちょっと調べてみると、こんなページがあり、参考にさせてもらいました。
プログラムを組んで実験してみましたが、やはり高速ですね。memcpyで2GB/s位ですが、こちらの方法なら4GB/sと2倍前後の速度が確かに出ていました。(数字はうろ覚え<おい)
コードを書くときにはテンプレート関数(template<class>ではなく、template<int>のパターン)か、defineによる関数の生成をうまいこと使って書きましょう。
memsetバージョンも作ってみましたが、こちらは「アライメントがはじめからそろっている」パターンでのみ高速という不思議な結果でした。
memsetの場合は、64byteごとではなく、32byteごとに転送しないと私のCPU(Core2Quad)の場合はあまりよくないようでした。
もう少し調べたらまた書くかもしれません。