gpt4 book ai didi

linux - DMA 通过 PCIe 到其他设备

转载 作者:太空狗 更新时间:2023-10-29 11:19:28 25 4
gpt4 key购买 nike

我正在尝试直接从 Linux 中的另一个 PCIe 设备访问 NIC 中的 DMA 地址。具体来说,我试图从 NVIDIA GPU 读取它以一起绕过 CPU。我研究过零拷贝网络和 DMA 到用户空间的帖子,但它们要么没有回答问题,要么涉及从内核空间到用户空间的一些拷贝。由于延迟不一致,我试图避免使用任何 CPU 时钟,而且我对延迟的要求非常严格。

我找到了我使用的英特尔网卡的 NIC 驱动程序(e1000e 驱动程序),并且找到了环形缓冲区的分配位置。正如我从之前阅读的一篇论文中了解到的那样,我会对 dma_addr_t 类型的描述符感兴趣。它们还有一个名为 dma 的 rx_ring 结构成员。我使用 ioctl 调用传递了 desc 和 dma 成员,但我无法在 GPU 中获取除零之外的任何内容。

GPU代码如下:

int *setup_gpu_dma(u64 addr)                                                     
{
// Allocate GPU memory
int *gpu_ptr;
cudaMalloc((void **) &gpu_ptr, MEM_SIZE);

// Allocate memory in user space to read the stuff back
int *h_data;
cudaMallocHost((void **)&h_data, MEM_SIZE);

// Present FPGA memory to CUDA as CPU locked pages
int error = cudaHostRegister((void **) &addr, MEM_SIZE,
CU_MEMHOSTALLOC_DEVICEMAP);
cout << "Allocation error = " << error << endl;

// DMA from GPU memory to FPGA memory
cudaMemcpy((void **) &gpu_ptr, (void **)&addr, MEM_SIZE, cudaMemcpyHostToDevice);
cudaMemcpy((void **) &h_data, (void **)&gpu_ptr, MEM_SIZE, cudaMemcpyDeviceToHost);

// Print the data

// Clean up
}

我做错了什么?

最佳答案

cudaHostRegister() 在已分配的主机内存上运行,因此您必须传递 addr,而不是 &addr

如果 addr 不是主机指针,这将不起作用。如果它主机指针,您的函数接口(interface)应该使用void *,然后就不需要类型转换了。

关于linux - DMA 通过 PCIe 到其他设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19526699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com