在我们编写CUDA程序时我们经常要对CPU和GPU上分配内存和管理,这样就增加了编写程序发复杂度。在cuda6后引入了统一寻址(Unified Memory)技术,该技术使得CPU和GPU使用同一个指针对同一块内存进行处理,省去了原始的在CPU和CPU分配内存然后来回拷贝的过程,简化了程序的编写。
统一寻址创建了一块托管内存(managed memory),这是在CPU和GPU共享的内存,它在CPU和GPU之间架起了桥梁。这块托管内存CPU和GPU都能访问通过单一指针访问得到,最关键的一点是,系统会自动地在host端和device端转移在Unified Memory内存分配的数据,这样就好像看起来CPU内存好像运行在GPU,GPU内存好像运行在CPU。
下面写了一个简单的向量相加程序来比较使用统一寻址和不使用统一寻址程序的复杂度和计算时间。
1.传统的向量相加程序:
#include <cuda_runtime.h> #include <stdio.h> #define NUM 1024*2 __global__ void add(int *a,int *b,int *c){ int tid=threadIdx.x+blockIdx.x*blockDim.x; if(tid<NUM){ c[tid]=a[tid]+b[tid]; } } int main(){ int i; int *a,*b,*c; int *a_device,*b_device,*c_device; cudaEvent_t start,end; float elapsedTime; cudaEventCreate(&start); cudaEventCreate(&end); cudaEventRecord(start,0); a=(int *)malloc(NUM*sizeof(int)); b=(int *)malloc(NUM*sizeof(int)); c=(int *)malloc(NUM*sizeof(int)); cudaMalloc((void **)&a_device,NUM*sizeof(int)); cudaMalloc((void **)&b_device,NUM*sizeof(int)); cudaMalloc((void **)&c_device,NUM*sizeof(int)); for(i=0;i<NUM;i++){ a[i]=i; b[i]=i; } cudaMemcpy(a_device,a,sizeof(int)*NUM,cudaMemcpyHostToDevice); cudaMemcpy(b_device,b,sizeof(int)*NUM,cudaMemcpyHostToDevice); add<<<NUM/1024+1,1024>>>(a_device,b_device,c_device); cudaDeviceSynchronize(); cudaMemcpy(c,c_device,sizeof(int)*NUM,cudaMemcpyDeviceToHost); cudaEventRecord(end,0); cudaEventSynchronize(end); cudaEventElapsedTime(&elapsedTime,start,end); printf("tie===%3.1f ms\n",elapsedTime); cudaFree(a_device); cudaFree(b_device); cudaFree(c_device); free(a); free(b); free(c); return 0; }
运行结果:tie===0.3 ms
2.使用统一寻址方式:
#include <cuda_runtime.h> #include <stdio.h> #define NUM 1024*2 __global__ void add(int *a,int *b,int *c){ int tid=threadIdx.x+blockIdx.x*blockDim.x; if(tid<NUM){ c[tid]=a[tid]+b[tid]; } } int main(){ int i,j; int *a,*b,*c; cudaEvent_t start,end; float elapsedTime; cudaEventCreate(&start); cudaEventCreate(&end); cudaEventRecord(start,0); cudaMallocManaged(&a,NUM*sizeof(int)); cudaMallocManaged(&b,NUM*sizeof(int)); cudaMallocManaged(&c,NUM*sizeof(int)); for(i=0;i<NUM;i++){ a[i]=i; b[i]=i; } add<<<NUM/1024+1,1024>>>(a,b,c); cudaDeviceSynchronize(); cudaEventRecord(end,0); cudaEventSynchronize(end); cudaEventElapsedTime(&elapsedTime,start,end); printf("tie===%3.1f ms\n",elapsedTime); cudaFree(a); cudaFree(b); cudaFree(c); return 0; }
运行结果:tie===10.2 ms
从以上代码的比较可以看出,使用统一寻址方式可以减少代码编写的复杂度,但不会减少代码运行的时间复杂度,反而还增加了时间复杂度。因此在以后编写代码时根据自己的需求使用统一寻址编码方式。为什么会增加这么大的时间复杂度?,目前还不太清楚,希望有理解的朋友能赐教一下。
参考:http://www.ouccloud.com/356.html
相关推荐
- 提供了更多的内存管理选项,如统一虚拟内存 (Unified Virtual Memory, UVM),使得数据在 CPU 和 GPU 之间的移动更加高效。 #### 3. 工具链增强 - 包括 NVIDIA Nsight Visual Studio Edition 和 NVIDIA Nsight ...
在CUDA编程中,主要涉及四种类型的内存:全局内存(Global Memory)、共享内存(Shared Memory)、常量内存(Constant Memory)和局部内存(Local Memory)。理解这些内存类型及其特性对于提高CUDA程序的效率至关...
CUDA(Compute Unified Device Architecture)是NVIDIA推出的一种并行计算平台和编程模型,它允许开发者使用C、C++、Fortran等语言直接对GPU进行编程,从而实现高性能计算。 PyTorch是一款广泛使用的深度学习框架,...
在本文中,我们将深入探讨如何使用CUDA(Compute Unified Device Architecture)技术,特别是在处理图像滤波时,特别是Sobel边缘检测算法的应用。CUDA是NVIDIA公司推出的一种并行计算平台和编程模型,它允许开发者...
CUDA(Compute Unified Device Architecture)是由NVIDIA推出的一种并行计算平台和编程模型,它使得开发者能够利用GPU(图形处理单元)的强大计算能力来解决复杂的计算问题。在"algorithms-cuda-master.zip"这个...
CUDA,全称为Compute Unified Device Architecture,是NVIDIA推出的一种并行计算平台和编程模型,主要用于利用图形处理器(GPU)的强大计算能力解决复杂的计算问题。这份名为"cuda-samples-his-result共2页.pd"的PDF...
CUDA (Compute Unified Device Architecture) 是 NVIDIA 开发的一种通用并行计算架构,允许开发者使用 C、C++、Fortran 等高级语言进行 GPU 编程。本课程旨在深入讲解如何针对 NVIDIA GPU 进行高性能计算优化。 ###...
CUDA的内存类型包括全局内存(Global Memory)、共享内存(Shared Memory)、纹理内存(Texture Memory)和常量内存(Constant Memory),而OpenCL则有全局内存、局部内存(Local Memory)、私有内存(Private ...
4. **Unified Memory**:自动管理GPU和CPU之间的数据传输,简化编程模型。 **cuDNN (CUDA Deep Neural Network)** 是一个用于深度神经网络的GPU加速库,它为常见的深度学习层如卷积、池化、激活和归一化提供了高效...
CUDA(Compute Unified Device Architecture)是NVIDIA推出的一种并行计算平台和编程模型,允许开发者利用GPU的并行计算能力执行通用计算任务。通过CUDA,程序员可以编写C/C++、Fortran或Python等语言的代码,并直接...
CUDA(Compute Unified Device Architecture)是由NVIDIA推出的编程模型,它允许开发者利用图形处理单元(GPU)进行高性能计算。CUDA并行加速是通过将计算任务分解为大量独立的子任务,然后在GPU的众多核心上同时...
在深度学习领域,CUDA(Compute Unified Device Architecture)是NVIDIA公司推出的一种编程接口,它允许开发者利用GPU的强大计算能力进行并行处理。然而,在训练深度学习模型时,我们经常遇到“CUDA error: out of ...
CUDA,全称Compute Unified Device Architecture,是NVIDIA公司推出的一种并行计算平台和编程模型,主要应用于GPU(图形处理器)上进行高性能计算。本讲座的主题是“数据访问和传输在CUDA中的相关方面”,我们将深入...
CUDA(Compute Unified Device Architecture)是由NVIDIA推出的编程模型,它允许开发者利用图形处理单元(GPU)进行高性能计算。CUDA并行加速是通过将计算任务分解为大量并行可执行的任务,然后在GPU的多核心上同时...
CUDA(Compute Unified Device Architecture)是NVIDIA公司推出的一种编程模型,允许开发者利用GPU的强大并行计算能力来加速应用程序。本教程将深入探讨如何使用CUDA来并行加速实现 UpsampleNearest2D 操作,这是一...
为了解决这个问题,我们可以利用GPU的并行计算能力,比如CUDA(Compute Unified Device Architecture)平台,来加速KMeans算法的执行。 CUDA是由NVIDIA公司推出的编程模型,允许开发者直接利用GPU进行高性能计算。...
- CUDA的核心概念包括:主机(Host)代码和设备(Device)代码、线程块(Thread Block)、网格(Grid)、共享内存(Shared Memory)以及全局内存(Global Memory)等。 - GPU的并行计算能力使得CUDA在处理大规模...
在深度学习领域,CUDA(Compute Unified Device Architecture)是一种由NVIDIA公司推出的编程模型,它使得开发者能够利用GPU的并行计算能力来加速计算密集型任务。CUDA并行加速线性注意力机制是将这一技术应用于自然...
CUDA (Compute Unified Device Architecture) is a parallel computing platform and application programming interface (API) model created by NVIDIA. It enables software developers and software engineers ...
- **内存管理改进**:包括统一内存管理(Unified Memory)的增强以及新的内存复制函数等。 - **性能优化工具**:如Nsight Visual Studio Edition和Nsight Systems等工具,可以帮助开发者更有效地分析和优化代码。 - ...