私たちが知っているように:http://en.wikipedia.org/wiki/IOMMU#Advantages
周辺メモリのページングは IOMMUでサポートできます。PCI-SIG PCIe アドレス変換サービス (ATS) ページ要求インターフェイス (PRI) 拡張機能を使用する周辺機器は、メモリ マネージャー サービスの必要性を検出して通知できます。
しかし、CUDA >= 5.0 で nVidia GPU を使用すると、RDMA GPUDirect を使用でき、次のことがわかります。
http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#how-gpudirect-rdma-works
従来、BAR ウィンドウなどのリソースは、CPU の MMU をメモリ マップド I/O (MMIO) アドレスとして使用して、ユーザーまたはカーネル アドレス空間にマップされていました。ただし、現在のオペレーティング システムにはドライバー間で MMIO 領域を交換するための十分なメカニズムがないため、NVIDIA カーネル ドライバーは関数をエクスポートして、必要なアドレス変換とマッピングを実行します。
http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#supported-systems
GPUDirect の RDMA は現在、PCI デバイスの観点から見て、すべての物理アドレスが同じであることに依存しています。これにより IOMMU との互換性がなくなるため、RDMA for GPUDirect が機能するように IOMMU を無効にする必要があります。
CPU-RAM を UVA に割り当ててマッピングすると、次のようになります。
#include <iostream>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
int main() {
// Can Host map memory
cudaSetDeviceFlags(cudaDeviceMapHost);
// Allocate memory
unsigned char *host_src_ptr = NULL;
cudaHostAlloc(&host_src_ptr, 1024*1024, cudaHostAllocMapped);
std::cout << "host_src_ptr = " << (size_t)host_src_ptr << std::endl;
// Get UVA-pointer
unsigned int *uva_src_ptr = NULL;
cudaHostGetDevicePointer(&uva_src_ptr, host_src_ptr, 0);
std::cout << "uva_src_ptr = " << (size_t)uva_src_ptr << std::endl;
int b; std::cin >> b;
return 0;
}
Windwos7x64 で等しいポインターを取得します。つまり、cudaHostGetDevicePointer()
何もしません。
host_src_ptr = 68719476736
uva_src_ptr = 68719476736
「ドライバー間でMMIO領域を交換するための十分なメカニズム」とはどういう意味ですか、ここでどのようなメカニズムが意味されているのか、仮想アドレスを使用してPCIe経由でBARの物理領域にアクセスすることでIOMMUを使用できない理由-PCIeを介した別のメモリマップデバイス?
これは、RDMA GPUDirect が常に (CPU の物理アドレス空間内の) 物理アドレスのみを操作することを意味しますが、CPU の仮想アドレス空間内の単純なポインターにuva_src_ptr
等しいカーネル関数に送信するのはなぜですか?host_src_ptr