昔作ってた
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を考えたい.
・
第二回カーネル/VM探検隊
ほどほどに面白かった. ただ16時~20時半の長丁場は辛かった. 途中でおなか空きすぎて頭が半分回ってなかった.
MINIX SMPのところで66h, 67hをnopに置き換えてる理由がわからないと言ってはったので32bitモードで16bitコード生成したいからとちゃうって適当に答えてしまったが,
ソースのコメントに
書いてあった.
・副都心線初めて乗った. 渋谷で上に出ようとして階段使ったら100段あった. なんて深いところにあるんや.
・CANS2009で発表するF
21223, F
3509上のTateペアリングのソースコードが
公開された.
私は途中参加だったのでC++ならもちっと楽できるんだけどなあと思いつつ郷に従う. なにはともあれ, こういう最速狙うコードで公開されてるのは殆ど無いのでめでたい.
・下記のposix_time::from_time_tの件,
2007年に既に指摘されてるのに直ってないということは直す気ないんやろか. trackが見えんでよう分からん.
こっちの人もfrom_time_tについて
何か言ってるなあ. これも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でも駄目なんだよなあ.