憂鬱な午後のひととき


11月7日_
昔作ってたlogの計算をintrinsicでやってみた(log.cpp). とりあえずasmを焼き直しただけなので改良の余地は多々あるだろうがCore2Duo 1.8GHzでベンチ.
32bit VC9 32bit VC9 /fp:fast 64bit VC 32bit gcc 4.1.2 64bit gcc 4.1.2
log 0.687 0.375 0.188 0.48 0.330
my_log 0.156 0.125 0.130 0.110 0.100
計測がいいかげんなので有効数字2桁なさそうやけど32bitで概ね3~4倍. 64bitのVCのlogはがんばってるなあ. 昔はdivpsよりもrcpps+ニュートン補完が速かったんやけど今は違うのか?(要検証) まあ, 昔の最適化が現在でもそれなりに意味はあると分かったので次はexpを考えたい.
11月6日_
from_time_tの問題は1.41.0で対応するっぽい. と思ったらまだ駄目だった.
11月5日_
第二回カーネル/VM探検隊
ほどほどに面白かった. ただ16時~20時半の長丁場は辛かった. 途中でおなか空きすぎて頭が半分回ってなかった. MINIX SMPのところで66h, 67hをnopに置き換えてる理由がわからないと言ってはったので32bitモードで16bitコード生成したいからとちゃうって適当に答えてしまったが, ソースのコメントに書いてあった.
・副都心線初めて乗った. 渋谷で上に出ようとして階段使ったら100段あった. なんて深いところにあるんや.
11月4日_
・CANS2009で発表するF21223, F3509上のTateペアリングのソースコードが公開された. 私は途中参加だったのでC++ならもちっと楽できるんだけどなあと思いつつ郷に従う. なにはともあれ, こういう最速狙うコードで公開されてるのは殆ど無いのでめでたい.
・下記のposix_time::from_time_tの件, 2007年に既に指摘されてるのに直ってないということは直す気ないんやろか. trackが見えんでよう分からん. こっちの人もfrom_time_tについて何か言ってるなあ. これも2年前だ.
11月2日_
boost::posix_time::from_time_t(time_t)は64bit用time_tに対応してないぽい(boost 1.40). VC9@32bit, gcc 4.1@64bitで確認.
#include <stdio.h>
#include <time.h>
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>

void Put(time_t t)
{
    struct tm tm;
    char buf[64];
#ifdef _WIN32
    _gmtime64_s(&tm, &t);
    asctime_s(buf, &tm);
#else
    gmtime_r(&t, &tm);
    asctime_r(&tm, buf);
#endif
    printf("time=%s", buf);
}

int main()
{
    time_t t;
    boost::posix_time::ptime bt;

    time(&t);
    printf("sizeof=%d\n", sizeof(t));
    Put(t);
    bt = boost::posix_time::from_time_t(t);
    std::cout << "boost:" << bt << std::endl;

    std::cout << "boost:" << (bt + boost::gregorian::years(29)) << std::endl;

    t += 84600 * 365 * 29;

    Put(t);
    bt = boost::posix_time::from_time_t(t);
    std::cout << "boost:" << bt << std::endl;

}

sizeof=8
time=Mon Nov 02 13:39:33 2009
boost:2009-Nov-02 13:39:33
boost:2038-Nov-02 13:39:33
time=Sat Mar 20 01:09:33 2038
boost:1902-Feb-11 18:41:17 ; おかしい
sizeof(time_t) = 4な環境で駄目なのはしかたないけど, そうじゃない環境では対応しておいて欲しいなあ. 言ってみるか.
  ptime from_time_t(std::time_t t)
  {
    ptime start(gregorian::date(1970,1,1));
    return start + seconds(static_cast<long>(t));
  }
longにキャストしてるからか? でも64-bit Linuxでも駄目なんだよなあ.

御意見は光成滋生<herumi@nifty.com>までお願いします