128 ビット 4-way SSE2 の自動検出

8 件のメッセージ BitcoinTalk サトシ・ナカモト, tcatm, nelisky, ジェフ・ガージック, teknohog, lfm, nimnul 2010年9月9日 — 2010年9月10日

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 でビルドした場合のみ有効だ。

tcatm 2010年9月9日 15:02 UTC 原文 ·

すべての実装をベンチマーク(リアルタイムではなく CPU 時間で)して最速のものを選び、ベンチマーク中にアルゴリズムが実際に動作するかも確認すべきだ。

nelisky 2010年9月9日 15:39 UTC 原文 ·
tcatmの投稿(2010年9月9日 15:02 UTC)

すべての実装をベンチマーク(リアルタイムではなく CPU 時間で)して最速のものを選び、ベンチマーク中にアルゴリズムが実際に動作するかも確認すべきだ。

そうだな、CUDA ハッシャーを実装しているときにこれを考えていた。ハッシュハンドラへのインターフェース(あるいは実装ごとの完全なマイナー)があるべきで、既知のブロックを渡して 1000個のナンスをハッシュさせ、結果を比較する、同時にベンチマークも取る、というシンプルな方法があるべきだ。実装はそれほど難しくないはずで、新しいアルゴリズムを開発するときに役立つだろう。

このインターフェーススキーマは、FPGA ベースのエンジンなどを組み込む場合にも役立つだろう。デフォルトのマイニングスキーマをいじらずに、コードへの特定のエントリポイントを持てる。

tcatmの投稿(2010年9月9日 15:02 UTC)

すべての実装をベンチマーク(リアルタイムではなく CPU 時間で)して最速のものを選び、ベンチマーク中にアルゴリズムが実際に動作するかも確認すべきだ。

+1 同意する。各ユーザーが起動時にこれを行うのは難しくも時間がかかることでもない。

teknohog 2010年9月9日 19:32 UTC 原文 ·

CallCPUID 関数に x86 アセンブラが含まれているため、他のアーキテクチャではビルドが失敗する。main.cpp の 2770 行目を以下のように変更した

#if defined(GNUC) && defined(CRYPTOPP_X86_ASM_AVAILABLE)

これで少なくとも ARM 上でコンパイルが通るようになった。

lfm 2010年9月10日 02:47 UTC 原文 ·

VIA C7 のコードを標準クライアントに自動検出付きで組み込めないだろうか?それとも、メインコードを煩わせるにはあまりにもレアなプロセッサーか? C7 は通常の Pentium や SSE2 コードでも標準クライアントで動くが、速度は遅い。

nimnul 2010年9月10日 12:34 UTC 原文 ·
neliskyの投稿(2010年9月9日 15:39 UTC)

ハッシュハンドラへのインターフェース(または実装ごとの完全なマイナー)があるべきだ

+1。誰かが FPGA やその他の専用アクセラレータを使いたい場合に備えて。

teknohogの投稿(2010年9月9日 10:32 UTC)

CallCPUID関数にx86アセンブラが含まれているため、他のアーキテクチャではビルドが失敗する。main.cppの2770行目を以下のように変更した

SVN rev 152 に追加した。