在新的CUDA6中,是否可以通过简单的指针从CPU内核访问GPU-RAM?

在新的CUDA6中,是否可以通过简单的指针从CPU内核访问GPU-RAM?,cuda,gpgpu,nvidia,virtual-address-space,Cuda,Gpgpu,Nvidia,Virtual Address Space,现在,如果我使用这段代码尝试使用GeForce GTX460SE(CC2.1)中的CUDA5.5从CPU内核访问GPU-RAM,那么我会得到一个异常“访问冲突”: #包括“cuda_runtime.h” #包括“设备启动参数.h” #包括 int main() { 无符号字符*gpu\ptr=NULL; cudamaloc((void**)和GPUptr,1024*1024); *GPUptr=1; intq;std::cin>>q; 返回0; } 但是我们知道,有UVA(统一虚拟寻址)。还有

现在,如果我使用这段代码尝试使用GeForce GTX460SE(CC2.1)中的CUDA5.5从CPU内核访问GPU-RAM,那么我会得到一个异常“访问冲突”:

#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
int main()
{
无符号字符*gpu\ptr=NULL;
cudamaloc((void**)和GPUptr,1024*1024);
*GPUptr=1;
intq;std::cin>>q;
返回0;
}
但是我们知道,有UVA(统一虚拟寻址)。还有一些新的:

  • 2013年10月25日-331.17 Beta Linux GPU驱动程序:新的NVIDIA统一内核内存模块是一个新的内核模块,用于统一内存功能,将在即将发布的NVIDIA CUDA中公开。新模块为nvidia-uvm.ko,将在GPU和系统RAM之间提供统一的内存空间
  • CUDA 6的主要功能包括:统一内存--通过使应用程序能够访问CPU和GPU内存而无需手动将数据从一个内存复制到另一个内存,从而简化编程,并使在各种编程语言中添加对GPU加速的支持变得更容易

是否可以使用新CUDA6中的简单指针从CPU内核访问内存GPU-RAM?

是的,CUDA6中的新
统一内存
功能将使在开普勒设备和其他设备上(而不是在费米GPU上)共享主机和设备代码之间的指针成为可能

为了实现这一点,您需要使用开普勒设备(so cc 3.0或3.5)和新的
cudamalocmanaged
API。这将在CUDA 6.0正式发布后进一步记录,但在此期间,您可以在上阅读更多关于它的信息,其中包括示例

这种机制不会神奇地导致PCI Express总线的效果消失,因此实际上发生的情况是,数据的两个副本正在“幕后”制作,并且cuda运行时会根据需要自动安排
cudaMemcpy
操作。还有很多其他的实现问题需要注意,现在我建议阅读博客


请注意,统一内存(UM)与统一虚拟寻址(UVA)不同,统一虚拟寻址(UVA)自CUDA 4.0以来一直可用。

是的,CUDA 6中新的
统一内存
功能将使在开普勒设备和其他设备(而不是费米GPU)上共享主机和设备代码之间的指针成为可能

为了实现这一点,您需要使用开普勒设备(so cc 3.0或3.5)和新的
cudamalocmanaged
API。这将在CUDA 6.0正式发布后进一步记录,但在此期间,您可以在上阅读更多关于它的信息,其中包括示例

这种机制不会神奇地导致PCI Express总线的效果消失,因此实际上发生的情况是,数据的两个副本正在“幕后”制作,并且cuda运行时会根据需要自动安排
cudaMemcpy
操作。还有很多其他的实现问题需要注意,现在我建议阅读博客


请注意,统一内存(UM)与统一虚拟寻址(UVA)不同,后者从CUDA 4.0开始提供,现在是。

谢谢!也就是说,从CPU核心直接访问GPU-RAM的机会仍然没有。但是,分配一个托管内存是可能的,它将在页面级别自动从CPU-RAM移到GPU-RAM,然后再移回来,这取决于驱动程序如何被视为更优化的性能。若托管内存移动到GPU-RAM,然后CPU核心尝试访问它,那个么CPU将启动DMA控制器向这个GPU-RAM(内存页)发送数据。是这样吗?从程序员的角度来看,CPU“似乎”能够直接访问GPU内存(如果分配了
cudamalocmanaged
)。你其余的陈述在我看来是正确的。如果我使用SSE指令从CPU核心访问GPU-RAM,那么数据将被发送到PCI Express BAR(基址寄存器-作为硬件功能),其中映射的GPU-RAM和重要的东西-它的DMA控制器将不被使用(因为DMA控制器会增加小数据包的延迟),不是吗?我不打算详细介绍这个功能的实现,它不是公开的。但是,如果您使用分配给
cudamalocmanaged
的指针,并且遵守其他要求(例如,当同样访问它的内核正在运行时,不要访问它),那么无论您的代码是否使用SSE,它都应该“正常工作”。Ok。我感兴趣的只是影响DMA控制器工作与否的性能。谢谢!也就是说,从CPU核心直接访问GPU-RAM的机会仍然没有。但是,分配一个托管内存是可能的,它将在页面级别自动从CPU-RAM移到GPU-RAM,然后再移回来,这取决于驱动程序如何被视为更优化的性能。若托管内存移动到GPU-RAM,然后CPU核心尝试访问它,那个么CPU将启动DMA控制器向这个GPU-RAM(内存页)发送数据。是这样吗?从程序员的角度来看,CPU“似乎”能够直接访问GPU内存(如果分配了
cudamalocmanaged
)。你其余的陈述在我看来是正确的。如果我使用SSE指令从CPU核心访问GPU-RAM,那么数据将被发送到PCI Express BAR(基址寄存器-作为硬件功能),其中映射的GPU-RAM和重要的东西-它的DMA控制器将不被使用(因为DMA控制器会增加小数据包的延迟),不是吗?我不打算详细介绍这个功能的实现,它不是公开的。但是如果您使用分配给
cudamalocmanaged
的指针,并且遵守其他要求(例如不访问
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <iostream>

int main()
{
    unsigned char* gpu_ptr = NULL;
    cudaMalloc((void **)&gpu_ptr, 1024*1024);

    *gpu_ptr = 1;

    int q; std::cin >> q;
    return 0;
}