HPC ワークロードに DMA バッファを割り当てようとしています。64GB のバッファ領域が必要です。計算の合間に、一部のデータが PCIe カードにオフロードされます。pci_alloc_consistent で指定された大量の 4MB バッファにデータをコピーするのではなく、1GB の HugePages でバックアップされた 64 個の 1GB バッファを作成したいと考えています。
背景情報: カーネル バージョン: CentOS 6.4 / 2.6.32-358.el6.x86_64 カーネル ブート オプション: hugepagesz=1g hugepages=64 default_hugepagesz=1g
/proc/meminfo の関連部分: AnonHugePages: 0 kB HugePages_Total: 64 HugePages_Free: 64 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 1048576 kB DirectMap4k: 848 kB DirectMap2M: 2062336 kB DirectMap1G: 132120576 kB
-t hugetlbfs nodev /mnt/hugepages をマウントできます。CONFIG_HUGETLB_PAGE は true です。MAP_HUGETLB が定義されています。
libhugetlbfs を使用してユーザー空間で get_huge_pages() を呼び出すことに関する情報を読みましたが、理想的には、このバッファーはカーネル空間に割り当てられます。MAP_HUGETLB で do_mmap() を呼び出してみましたが、空き hugepage の数は変わらないようでした。
だから私は何を得ていると思いますか、カーネル空間でバッファを1GBのHugePageにマップできる方法はありますか、それともユーザー空間で行う必要がありますか? または、誰かが他の方法を知っていれば、カーネルバッファーとして利用可能な連続した物理メモリの膨大な量 (1-64GB) を取得できますか?