問題タブ [pci-e]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-device-driver - pci_disable_msi おっとバグ
PCIe デバイスの MSI 割り込みを処理するカーネル モジュールを作成しようとしています。現在、ドライバーの簡単なスケルトン アウトラインを作成しましたが、'pci_disable_msi(dev)' を呼び出そうとすると、カーネル NULL ポインター逆参照エラーを処理できません。/Documentation/PCI/MSI-HOWTO.txt に記載されているとおりに正確に従っていますが、このエラーが発生することはないように思われます。これはバグですか、それとも私の設定が間違っていますか? 発生した最後の印刷から判断すると、pci_disable_msi() を呼び出したときに fpga_remove() で発生していると確信しています。(明らかに、これはモジュールを削除しているときに発生します)
linux-kernel - pci_enable_msi_block の使用
カーネル モジュールで複数の MSI irq 行を有効にしようとしています。RCモードで操作しています。問題は、それを呼び出すpci_enable_msi_block()
と、複数の MSI が割り当てられないことです。呼び出すpci_enable_msi_block(dev, 32)
と、4 が返されます (これは、4 つの MSI を使用できることを意味するはずです)。次に、呼び出すpci_enable_msi_block(dev,4)
と、1 が返されます。
$lspci -v
これは後の出力ですがinsmod Custom_module.ko
、1 つの MSI の有効化のみが成功しています。
複数の MSI を使用するにはどうすればよいですか。JTAG を使用して Enable_MSI レジスタを編集し、EP で MSI をトリガーできますが、これらの IRQ 専用のハンドラーはありません。
linux - Linux での PCIe 再スキャン後に BAR リージョンが割り当て解除される
Linux システムの PCIe に FPGA カードを接続しています。FPGA を再プログラムするecho 1 > /sys/bus/pci/rescan
と、カードが に表示されlspci
ます。
ただし、BAR リージョンにはメモリが割り当てられていません。
pci=
Linux ブート コマンド ラインでさまざまなフラグを試しましたが、あまり効果がありませんでした。
私の疑いでは、BAR 領域が大きすぎるため、ブート時に存在しなかったため、Linux がアドレス空間で適切に整列された範囲を見つけて BAR をマップできないのではないかと考えています。
これは正しい理論ですか?デバイス用にスペースを予約するように Linux に指示することはできますか?
language-agnostic - コマンドをビデオ メモリに保存するか、PCIe 経由でコマンドにアクセスするか
私は現在、Fabian "ryg" Giesen による" A trip through the Graphics Pipeline " ブログ シリーズのパート 2を読んでいます。
この特定の部分で、彼は 1 つの興味深い点について話します。GPU が処理するコマンドは、GPU に常駐するビデオ メモリから、または PCI Express バス経由で CPU 側から読み取ることができます。
いくつかの長所と短所を暗黙のうちに理解しました。しかし、私はそれらについてかなりぼんやりしています。トレードオフを完全に理解しているとは言えません。とにかく、自分の考えを首尾一貫して提示しようとします。
ビデオメモリへのデータの保存:
- 間違いなく速い。
- ただし、メモリのオーバーヘッドがあります (帯域幅についてはわかりません)。
CPU からの読み取り:
- ビデオ メモリにデータを保存するのが無駄な場合 (おそらく、二度と使用されないため?) には、より良い方法である可能性があります。
- ビデオメモリにデータを保存すると、PCIe バスの帯域幅が節約されるため、そのデータを再利用するときに役立つと思います。
- ただし、この通信は、ビデオ メモリから直接読み取るよりも遅くなります。
この 2 つの間には、さらに多くの複雑さとトレードオフがあると感じています。また、上で述べたことが真実であるかどうかは完全にはわかりません。誰かに次のことをしてもらいたい:
- 私の理解を深めるために、いくつかの重要なトレードオフと、おそらく他の複雑さを説明してください。
- 私が上で言ったことは本当かどうかを確認してください! (これについてはまだよくわかっていません。)
verilog - PCIe をシミュレートして fpga エンドポイントをデバッグする方法
私はpcieを介して接続されたfpgaコントローラーに取り組んでいます。ハードウェアをデバッグできる唯一の方法は、chipscope を使用することです。そのため、ドライバーを介してコマンドを実行し、fpga からの信号をチェックします。
問題は、信号をチェックしてプロジェクトをデバッグするたびに、プロジェクトをビルドして fpga にロードするのに時間がかかることです。
pcie に接続された fpga をデバッグする簡単な方法はありますか?
すべての pcie 信号をシミュレートし、fpga をまったく実行する必要がない方法はありますか?
device-driver - PCIe バスに I/O コントローラをセットアップするのにかかる時間
InfiniBand または同様の PCIe デバイスと高速な Intel Core CPU があり、たとえば 8 バイトのユーザー データを IB リンク経由で送信したいとします。また、デバイス ドライバーやその他のカーネルがないことも言います。これを単純に保ち、ハードウェアに直接書き込むだけです。最後に、IB ハードウェアは以前にコンテキストに対して適切に構成されているため、何かが行われるのを待っているとします。
Q: ローカル CPU がデータの場所とデータの送信を開始する必要があることをハードウェアに伝えるには、何 CPU サイクルかかりますか?
詳細情報: CPU ローカル サービス (コプロセッサの使用など) と比較した PCIe 通信サービスの使用コストの見積もりを取得したいと考えています。私が期待しているのは、PCIe バス上のレジスタに多数の書き込みが行われることです。たとえば、パケットのアドレスと長さの設定、およびステータスや制御レジスタの読み取りと書き込みが行われる可能性があります。これらのそれぞれに数百の CPU サイクルがかかると予想されるため、全体的なセットアップには 1000 から 2000 の CPU サイクルがかかると予想されます。私は正しいでしょうか?
私は大まかな答えを探しているだけです...
cuda - GPU カーネルから結合されていない状態でアクセスされた場合の固定ホスト メモリ帯域幅のマッピング
カーネルのスレッドが読み取りまたは書き込みを行うホスト メモリ内に大きなint
配列があり、GPU グローバル メモリ内に保持できないとします。配列の要素へのアクセスが結合されると、PCI-Express レーンの理論上の帯域幅に近づく、ホスト メモリとの間のバースト読み取り/書き込みが期待できます。しかし、読み取りまたは書き込みが完全に散発的である (合体していない) 場合、帯域幅は理論上の最大帯域幅と比較してどのくらいになるでしょうか?
hereの下の図に基づいて、すべての書き込みトランザクションに対して 128 ビット長のパケットが必要です。ただし、32 ビット アドレッシング (UVA には 64 ビット マシンが必要であることを考慮) とデータ サイズとして 4 バイトを想定しています。これらの仮定が正しい場合、最大帯域幅の約 4 分の 1 を書き込みに、7 分の 1 を読み取りに期待できます。私は正しいですか?これらの仮定は正しいですか?
編集
uint
配列を使用して上記の質問のテストを設計および実行しました。私が得た帯域幅は、約 6.6 GB/s の帯域幅を持つ PCI-Express リンクでの大量の散発的な読み取りと大量の散発的な書き込みの両方で約 480 MB/s であり、13 から 14 倍の速度低下を示しました。どのように説明できますか?
linux - Linux PCI ドライバーは init を呼び出しますが、プローブは呼び出しません
PCIe 拡張スロットを介してマシンに接続された FPGA ボード用のドライバーを開発していますが、PC の前にボードの電源が入っていれば、すべてがうまく機能します。ただし、最初にコンピューターを予約してから FPGA ボードを予約すると、デバイスが認識されてモジュールがロードされるというかなり異常な動作が発生します (syslog で呼び出された「init」関数が表示されます)。呼び出されることはありません。
これは無効な BAR0 が原因だと思います。dmesg
ボードの電源を入れたときの出力:
その最初の reg は 0xb4000000-0xb400ffff のようなものである必要がありますが、代わりに 0 になっています。
このブロックを割り当てるために必要な追加の手順はありますか? または、これを行う必要があることをカーネルに示すにはどうすればよいですか?