128ビット4-way SSE2の自動検出
SVN rev 150には4-way SSE2を使用するかどうかを自動検出しようとするコードがある。128ビットSSE2を持つ特定の新しいCPUでのみ高速であり、64ビットSSE2のものでは速くないため、これが必要だ。
CPUID命令を使用してCPUブランド、ファミリー、モデル番号、ステッピングを取得する。それは簡単な部分だ。モデル番号をどう扱うかが難しい部分だ。CPUのファミリー、モデル、ステッピング番号のテーブルを見つけることができなかった。さまざまなランダムなレポートを参考にするしかなかった。
最終的にこうなった:
// 128ビットSSE2にはIntel NehalemまたはAMD K10以上が必要
// Nehalem = i3/i5/i7および一部のXeon
// K10 = 4コア以上のOpteron、Phenom、Phenom II、Athlon II
// Intel Core i5 family 6, model 26 or 30
// Intel Core i7 family 6, model 26 or 30
// Intel Core i3 family 6, model 37
// AMD Phenom family 16, model 10
bool fUseSSE2 = ((fIntel && nFamily * 10000 + nModel >= 60026) ||
(fAMD && nFamily * 10000 + nModel >= 160010));
AMD CPUのモデル番号に散発的な不整合があったので、これがすべての対応可能なAMDを検出できるか確信がない。
間違っている場合は、-4wayまたは -4way=0でオーバーライドできる。
検出結果はdebug.logに出力される。CPUIDで検索してくれ。
これはGCCでビルドした場合のみ有効だ。
すべての実装をベンチマーク(リアルタイムではなくCPU時間で)して最速のものを選び、ベンチマーク中にアルゴリズムが実際に動作するかも確認すべきだ。
すべての実装をベンチマーク(リアルタイムではなくCPU時間で)して最速のものを選び、ベンチマーク中にアルゴリズムが実際に動作するかも確認すべきだ。
そうだな、CUDAハッシャーを実装しているときにこれを考えていた。ハッシュハンドラへのインターフェース(あるいは実装ごとの完全なマイナー)があるべきで、既知のブロックを渡して1000個のナンスをハッシュさせ、結果を比較する、同時にベンチマークも取る、というシンプルな方法があるべきだ。実装はそれほど難しくないはずで、新しいアルゴリズムを開発するときに役立つだろう。
このインターフェーススキーマは、FPGAベースのエンジンなどを組み込む場合にも役立つだろう。デフォルトのマイニングスキーマをいじらずに、コードへの特定のエントリポイントを持てる。
すべての実装をベンチマーク(リアルタイムではなくCPU時間で)して最速のものを選び、ベンチマーク中にアルゴリズムが実際に動作するかも確認すべきだ。
+1同意する。各ユーザーが起動時にこれを行うのは難しくも時間がかかることでもない。
CallCPUID関数にx86アセンブラが含まれているため、他のアーキテクチャではビルドが失敗する。main.cppの2770行目を以下のように変更した
#if defined(GNUC) && defined(CRYPTOPP_X86_ASM_AVAILABLE)
これで少なくともARM上でコンパイルが通るようになった。
VIA C7のコードを標準クライアントに自動検出付きで組み込めないだろうか? それとも、メインコードを煩わせるには珍しすぎる代物かな? C7は通常のPentiumやSSE2コードでも標準クライアントで動くが、速度は遅い。
ハッシュハンドラへのインターフェース(または実装ごとの完全なマイナー)があるべきだ
+1。誰かがFPGAやその他の専用アクセラレータを使いたい場合に備えて。
CallCPUID関数にx86アセンブラが含まれているため、他のアーキテクチャではビルドが失敗する。main.cppの2770行目を以下のように変更した
#if defined(GNUC) && defined(CRYPTOPP_X86_ASM_AVAILABLE)
これで少なくともARM上でコンパイルが通るようになった。
SVN rev 152に追加した。