目先はちまちまとしている。で、ちょいと変わったコードを書いた。とりあえず、今は一人だからな。本質的な部分ではないが、ある種の人には面白いし、ググった限り先例はないのでメモ。
(何のことやらわからんひとと、「富豪」という言葉にヤられているひとは読めないと思うけれど、ごめんなさい。)
/// @brief 3による剰余(被除数定義域0~30)
///
/// 超絶ちまちま技巧。0b...101101101101をnビット右シフトした結果の下位2ビットが、
/// 1,2,3,1,2,3...になっていることを利用したもの。
/// 今回のコードはループの奥地で被除数高々17の3による剰余が多く含まれるので、
/// これを利用する。
///
/// @tparam _type 使用する型(ただし単純な整数型である必要がある)
/// @param[in] val 元の値
/// @return 3による剰余
template inline _type mod3_fast(_type val)
{
assert(val >= 0);
assert(val <= 30);
return _type(((0x6db6db6d>>val)&3)-1);
}
ねー。変態でしょ。
本質的にはテーブル参照なのだが、テーブルサイズが32ビットしかないわけですな。
でも、テーブル参照みたいにキャッシュを汚さない。これは本体のコードが、条件ジャンプほとんど無し、かつ、シーケンシャルメモリアクセスでぶん回るので、台無しにしないために必要なことなのです。
と言うわけで、ちまちました話でしたが、「ハッカーの楽しみ」にも載ってないネタ。
このプロジェクトが終わったら、教育目的以外にはコードを書かない生活に戻る予定なので、ひとりのうちに、小ネタ含めてとことんやりたいなあ。
(何のことやらわからんひとと、「富豪」という言葉にヤられているひとは読めないと思うけれど、ごめんなさい。)
/// @brief 3による剰余(被除数定義域0~30)
///
/// 超絶ちまちま技巧。0b...101101101101をnビット右シフトした結果の下位2ビットが、
/// 1,2,3,1,2,3...になっていることを利用したもの。
/// 今回のコードはループの奥地で被除数高々17の3による剰余が多く含まれるので、
/// これを利用する。
///
/// @tparam _type 使用する型(ただし単純な整数型である必要がある)
/// @param[in] val 元の値
/// @return 3による剰余
template inline _type mod3_fast(_type val)
{
assert(val >= 0);
assert(val <= 30);
return _type(((0x6db6db6d>>val)&3)-1);
}
ねー。変態でしょ。
本質的にはテーブル参照なのだが、テーブルサイズが32ビットしかないわけですな。
でも、テーブル参照みたいにキャッシュを汚さない。これは本体のコードが、条件ジャンプほとんど無し、かつ、シーケンシャルメモリアクセスでぶん回るので、台無しにしないために必要なことなのです。
と言うわけで、ちまちました話でしたが、「ハッカーの楽しみ」にも載ってないネタ。
このプロジェクトが終わったら、教育目的以外にはコードを書かない生活に戻る予定なので、ひとりのうちに、小ネタ含めてとことんやりたいなあ。