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

5 件のメッセージ BitcoinTalk サトシ・ナカモト, 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でビルドした場合のみ有効だ。

teknohog 2010年9月9日 原文 · 個別ページ

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

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

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

lfm 2010年9月10日 原文 · 個別ページ

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

nimnul 2010年9月10日 原文 · 個別ページ

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

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

Quote from: teknohog on September 09, 2010, 07:32:05 PM

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

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

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

SVN rev 152に追加した。