Intel CPU で 32 ビット ループ カウンターを 64 ビットに置き換えると、「_mm_popcnt_u64」のパフォーマンスが低下するのはなぜですか?
32 ビットのループ カウンタを 64 ビットに置き換えると、Intel CPU の mm_popcnt_u64 で異常なパフォーマンスの偏差が発生します
概要
この記事では、32 ビット ループ カウンタを_mm_popcnt_u64 組み込み関数を使用した、パフォーマンスが重要なループ内の 64 ビット カウンター。この問題により、Intel CPU のパフォーマンスが大幅に低下し、実行速度の低下につながりました。著者は、この動作の背後にある理由を調査し、考えられる解決策を提供します。
詳細
問題のコードには、データの配列を反復処理してポップカウントを実行するループが含まれています。 x86 組み込み命令を使用した操作。ループ カウンター変数は最初は符号なし整数でしたが、これを 64 ビット符号なし整数 (uint64_t) に置き換えると、パフォーマンスが約 50% 低下しました。
原因を調査するために、作成者は次のようにコードをコンパイルしました。さまざまな最適化フラグを設定し、結果のアセンブリ コードを分析しました。彼らは、32 ビット バージョンと 64 ビット バージョンで異なるアセンブリが生成されることを観察し、コンパイラのバグを疑いました。
しかし、異なるコンパイラでコードをテストした後、作成者は問題はないと結論付けました。これはコンパイラのバグが原因ではなく、ハードウェアの誤ったデータ依存関係が原因です。 _mm_popcnt_u64 命令を Intel Sandy/Ivy Bridge および Haswell プロセッサで使用すると、宛先レジスタに対する誤った依存関係が示され、宛先の準備ができるまで命令は実行前に待機します。この誤った依存関係はループの繰り返し全体に引き継がれ、プロセッサが異なる反復を並列化できなくなり、パフォーマンスの低下につながる可能性があります。
著者は、popcount 操作を分離し、誤った依存関係を解消することでパフォーマンスの違いを実証するインライン アセンブリ テストを提示しています。鎖。これらのテストは、誤った依存関係がパフォーマンスに大きな影響を及ぼし、速度が 18.6195 GB/s から 8.49272 GB/s に低下することを示しています。
この記事では、この問題が Intel CPU に影響するのに対し、AMD プロセッサには影響することも強調しています。これは間違っていないようです
解決策
このパフォーマンスの問題を軽減するために、著者はいくつかの解決策を提案しています。
- 代わりに 32 ビット ループ カウンターを使用します。この特定のループの 64 ビット カウンターの。
- 64 ビット ループを使用する場合カウンタが必要な場合は、popcount 操作で使用する前に宛先レジスタを明示的にゼロにして、誤った依存関係の連鎖を断ち切ります。
- この誤った依存関係を認識し、それを補うコードを生成するコンパイラを使用してください。
以上がIntel CPU で 32 ビット ループ カウンターを 64 ビットに置き換えると、「_mm_popcnt_u64」のパフォーマンスが低下するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

C#とCの歴史と進化はユニークであり、将来の見通しも異なります。 1.Cは、1983年にBjarnestrostrupによって発明され、オブジェクト指向のプログラミングをC言語に導入しました。その進化プロセスには、C 11の自動キーワードとラムダ式の導入など、複数の標準化が含まれます。C20概念とコルーチンの導入、将来のパフォーマンスとシステムレベルのプログラミングに焦点を当てます。 2.C#は2000年にMicrosoftによってリリースされました。CとJavaの利点を組み合わせて、その進化はシンプルさと生産性に焦点を当てています。たとえば、C#2.0はジェネリックを導入し、C#5.0は非同期プログラミングを導入しました。これは、将来の開発者の生産性とクラウドコンピューティングに焦点を当てます。

C#とCおよび開発者の経験の学習曲線には大きな違いがあります。 1)C#の学習曲線は比較的フラットであり、迅速な開発およびエンタープライズレベルのアプリケーションに適しています。 2)Cの学習曲線は急勾配であり、高性能および低レベルの制御シナリオに適しています。

オブジェクト指向プログラミング(OOP)のC#とCの実装と機能には大きな違いがあります。 1)C#のクラス定義と構文はより簡潔であり、LINQなどの高度な機能をサポートします。 2)Cは、システムプログラミングと高性能のニーズに適した、より細かい粒状制御を提供します。どちらにも独自の利点があり、選択は特定のアプリケーションシナリオに基づいている必要があります。

XMLからCへの変換とデータ操作の実行は、次の手順で達成できます。1)TinyXML2ライブラリを使用してXMLファイルを解析する、2)データのデータ構造にデータをマッピングし、3)データ操作のためのSTD :: VectorなどのC標準ライブラリを使用します。これらの手順を通じて、XMLから変換されたデータを処理および効率的に操作できます。

C#は自動ガベージコレクションメカニズムを使用し、Cは手動メモリ管理を使用します。 1。C#のゴミコレクターは、メモリを自動的に管理してメモリの漏れのリスクを減らしますが、パフォーマンスの劣化につながる可能性があります。 2.Cは、微細な管理を必要とするアプリケーションに適した柔軟なメモリ制御を提供しますが、メモリの漏れを避けるためには注意して処理する必要があります。

Cは、現代のプログラミングにおいて依然として重要な関連性を持っています。 1)高性能および直接的なハードウェア操作機能により、ゲーム開発、組み込みシステム、高性能コンピューティングの分野で最初の選択肢になります。 2)豊富なプログラミングパラダイムとスマートポインターやテンプレートプログラミングなどの最新の機能は、その柔軟性と効率を向上させます。学習曲線は急ですが、その強力な機能により、今日のプログラミングエコシステムでは依然として重要です。

C学習者と開発者は、Stackoverflow、RedditのR/CPPコミュニティ、CourseraおよびEDXコース、Github、Professional Consulting Services、およびCPPCONのオープンソースプロジェクトからリソースとサポートを得ることができます。 1. StackOverFlowは、技術的な質問への回答を提供します。 2。RedditのR/CPPコミュニティが最新ニュースを共有しています。 3。CourseraとEDXは、正式なCコースを提供します。 4. LLVMなどのGitHubでのオープンソースプロジェクトやスキルの向上。 5。JetBrainやPerforceなどの専門的なコンサルティングサービスは、技術サポートを提供します。 6。CPPCONとその他の会議はキャリアを助けます

C#は、開発効率とクロスプラットフォームのサポートを必要とするプロジェクトに適していますが、Cは高性能で基礎となるコントロールを必要とするアプリケーションに適しています。 1)C#は、開発を簡素化し、ガベージコレクションとリッチクラスライブラリを提供します。これは、エンタープライズレベルのアプリケーションに適しています。 2)Cは、ゲーム開発と高性能コンピューティングに適した直接メモリ操作を許可します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

メモ帳++7.3.1
使いやすく無料のコードエディター

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ドリームウィーバー CS6
ビジュアル Web 開発ツール
