パスワードを忘れた? アカウント作成

Yoh2さんのトモダチの日記みんなの日記も見てね。 みんなの日記の更新状況はTwitterの@sradjp_journalsでもチェックできます。

7324358 journal
プログラミング

Yoh2の日記: アライメント揃ってなくても大丈夫だというのは思い込み? 12

日記 by Yoh2

x86系って、SIMDを明示的に使わない限り、アライメント境界が揃っていないデータ転送プログラムを書いても、パフォーマンスさえ気にしなければ特に問題ないという認識でいた。
が、実はそんな保証がないのではないかという現象に遭遇した。
それはx86_64でuint64_tの配列をコピーするコード。gcc -O3でコンパイルし、コピー元を奇数アドレスにしたらプログラムが落ちた。

試したgccは以下の3種類。いずれも現象発生。

  • gcc-4.6.x (詳細忘れ。Ubuntu 12.04)
  • gcc-4.6.3 (Gentoo)
  • gcc-4.7.2 (Gentoo)

以下、再現コード。上記コンパイラで-O2までは問題ないが-O3で落ちる。

// foo.c -- コピー関数。最適化で呼び出しが消されないようにファイルを分けた。
#include <stddef.h>
#include <stdint.h>
 
void copy_uint64(uint64_t *restrict dst, const uint64_t *restrict src, size_t n)
{
        for(size_t i = 0; i < n; i++)
        {
                dst[i] = src[i];
        }
}

// bar.c -- srcに奇数アドレスを設定してコピー関数呼び出し
#include <stdlib.h>
#include <stdint.h>
 
void copy_uint64(uint64_t *restrict dst, const uint64_t *restrict src, size_t n);
 
int main(void)
{
        uint64_t *dst = (uint64_t *)malloc(sizeof(uint64_t) * 64);
        // アライメントされていないアドレスにする。
        uint64_t *src = (uint64_t *)((char *)malloc(sizeof(uint64_t) * 64 + 1) + 1);
 
        copy_uint64(dst, src, 64);
 
        return 0;
}

foo.cをgcc -O3 -Sしてみると、コピーしている部分と思われる箇所のアセンブリコードはこうなっていた。

        movdqa  (%r11,%rcx), %xmm0
        addq    $1, %r8
        movdqu  %xmm0, (%r10,%rcx)
        addq    $16, %rcx

srcから読み込んでいる部分がSSE命令の movdqa... 、dstに書き込んでいる部分が movdqu。
ここで曲者なのが movdqa。これは指定するアドレスが16バイト境界に揃っていなければならない命令。最適化の結果、これが使われてしまったために落ちていると思われる。
ちなみに、同じ効果を持ち、境界に揃っていなくてもよい movdqu という命令もある。このソースではdstへの書き込みで movdqu が使われている。
そのため、srcを境界整列させ、dstを奇数アドレスにした場合は問題なく実行が完了した。また、-Sで出力させたソースのmovdqaをmovdquに変更したものを使うと、srcが奇数アドレスでも問題なく実行が完了した。

最適化でSSE命令を使ってくれるのは歓迎なんだけど、アライメントなんて無視して横着したい身としてはこの最適化は厳しい。

んで結局これは (コンパイラの) バグなの? それとも (プログラムの) バグなの?

7319116 journal
日記

Yoh2の日記: SETI@Home仮復帰

日記 by Yoh2

一昨年の3.11から電力不足を懸念してSETI@Homeへの参加を見合わせていたが、PCアップグレード記念 & 鯖PCの復活させたCPUの動作確認 (取り付け時にソケットにクーラーを落としてピンを曲げたということもあったし) として再開してみた。
とはいえ、電力供給能力は低下したままのはずなので、東電に余裕がないような時は自重するつもり。

BOINCstats現在の状況を見てみると、世界順位が、過去最高で2987位だったところが12346位、国内順位が最高が不明で現在が622位。
世界順位はともかく、国内順位が思ったより下がってなかったと感じる。私と同様に参加を中止した人が多かったんだろうか。

# そして暑い部屋が復活……

6960433 journal
日記

Yoh2の日記: [覚書] 新PCパーツ候補

日記 by Yoh2

目先の物理コア数にほいほい釣られて今度もAMD。Bullが駄作? いいさ地雷踏んでやんよ。
……でもせめてグラボ回せる性能になって欲しいな。あと動けSSD。

CPU: Opteron 6376 x 2。
CPUクーラー: Dynatron A5A6 または Noctua NH-U12DO A3。値段考えるとA5かA6にしたいんだけどうるさそうなのがなぁ。
M/B : Supermicro H8DGi-F。IPMIで遊ぶのを諦めるなら-Fなしでも。
メモリ: 適当にRegistered ECC 4GiB x 8。通販より選択肢多そうだし、Arkで店頭買いかな。
その他: IEEE1394ボード。玄人志向のでいいか。

あと、鯖PCのアップグレードが遠退くのでCPUクーラー復活も考えた方がよさげ。
ソケット (Socket F) 側の爪が欠けたのが今のCPUクーラを使えない原因なので、爪を使わないタイプを探さないと。
Dynatron F558はどうだろう。写真を見るとバックパネルに直付けするスタイルに見えるけど。

6939820 journal
日記

Yoh2の日記: 賀正

日記 by Yoh2

明けましておめでとうございます。

毎年恒例のモナー神社。おみくじを引いたらこうなりました。

【小吉】(No.17618)モナー神社
願事 : 思わぬ障りありて叶い難し
待人 : 待てどもまず来ず
失物 : 物に隠れて出ず
旅立 : 止める方がよい
商売 : 売買ひかへめにすべし
学問 : 困難あり 心据えて勉強すべし
争事 : 初めは負ける
転居 : 其のまま居るが安全
病気 : 軽くとも長引く恐れあり 注意せよ
縁談 : 苦労するとも末は見込みあり 辛抱すべし

6919432 journal
ストレージ

Yoh2の日記: 続々・Linux起動時にSSDを認識できない事象が頻発 7

日記 by Yoh2

[2012-12-30追記: 諦めてPC新調することにしてSSD外しました。]

前々回の日記: [調査中] Linux起動時にSSDを認識できない事象が頻発
前回の日記: 続・Linux起動時にSSDを認識できない事象が頻発

相変わらずうまく認識させられてません。SSD替えてからは一度もまともに認識していないような。
今回はやってみた/分かったことふたつ。

ケーブルを替えてみた。
SATAインターフェース (MCP55) が3.0Gpbsまでの対応なので、ずっと3.0Gpbs対応のケーブルを使っていたけど、6.0Gpbs対応のケーブルに替えてみた。
結果: 相変わらず「model number mismatch」発生。

実はWindowsでも動きが怪しい?
Windows 7 (x64) では普通に使えているように見えたし、イベントビューアーでもSSD関連のエラーの記録は特になかったようだった (見落とし? 気付かないから見落としというわけで) ので正常動作していると思っていたけど、Intel SSD Toolboxを起動しようとしたら通信エラーによって起動できないという現象が発生。
SSDを外した環境では正常起動できた (Intel SSDがいないのでできることがほとんどないけど) ので、SSDとの接続が原因だと思われる。

今まで、Windowsでは問題なく動作しているという前提で考えていたので、設定含め、ソフト側の問題だと思っていたけど、こうなるとハード側の故障 or 相性問題の方も疑う必要があるなぁ。

6899825 journal
ストレージ

Yoh2の日記: 続・Linux起動時にSSDを認識できない事象が頻発 2

日記 by Yoh2

[2012-12-28: Intel SSD容量修正。×48GB→◯480GB]

前回の日記[調査中] Linux起動時にSSDを認識できない事象が頻発の続き。
相性問題 or 故障を疑って別のSSDを購入し装着してみた。前回使ってたSSDはCFD S6TM128NMPQ。で、今回はIntel SSDSC2CW480A3K5 (520シリーズの480GBモデル)。
結果:モデル名確認部で相変わらず2バイトずれてmodel number mismatchが起きる。前のSSDと一緒。
試しに、他の問題なく動作しているHDDと、ケーブル & ボートを交換してもSSDの方だけおかしくなる。今回は、今までうまく動いていたはずのリカバリーCDでもうまく認識せず。今まで動いてたのはたまたまだったのかも。

こりゃ相性問題、というか、SSDのレスポンスの早さにSATAチップ or ドライバが付いていけないのかな。いい加減古いし。
一度HDDに戻すべきかなぁ。あと、新しいSSDの処遇どうしよう。
手持ちのUSB-3&eSATA接続キットを介した場合は問題ないっぽいから外部ストレージとして使用するか。んー、何かもったいない。

typodupeerror

私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson

読み込み中...