CUDA实例练习(九):页锁定主机内存

malloc()分配的内存与cudaHostAlloc()分配的内存之间存在着一个重要差异。C库函数malloc()将分配标准的,可分页的(Pagable)主机内存,而cudaHostAlloc()将分配页锁定的主机内存。页锁定内存也称为固定内存(Pinned Memory)或者不可分页内存,它有一个重要的属性:操作系统将不会对这块内存分页并交换到磁盘上,从而确保了该内存始终驻留在物理内存中。因此,操作系统能够安全地使某个应用程序访问该内存的物理地址,因为这块内存将不会被破坏或者重新定位。

 1 #include <stdio.h>
 2 #include <cuda_runtime.h>
 3 #include <device_launch_parameters.h>
 4 #include "book.h"
 5
 6 #define SIZE (10*1024*1024)
 7
 8 float cuda_malloc_test(int size, bool up){
 9     cudaEvent_t start, stop;
10     int *a, *dev_a;
11     float elapsedTime;
12
13     HANDLE_ERROR(cudaEventCreate(&start));
14     HANDLE_ERROR(cudaEventCreate(&stop));
15
16     a = (int *)malloc(size * sizeof(*a));
17     HANDLE_NULL(a);
18     HANDLE_ERROR(cudaMalloc((void**)&dev_a, size * sizeof(*dev_a)));
19     HANDLE_ERROR(cudaEventRecord(start, 0));
20     for (int i = 0; i < 100; i++){
21         if (up)
22             HANDLE_ERROR(cudaMemcpy(dev_a, a, size * sizeof(*dev_a), cudaMemcpyHostToDevice));
23         else
24             HANDLE_ERROR(cudaMemcpy(a, dev_a, size * sizeof(*dev_a), cudaMemcpyDeviceToHost));
25     }
26     HANDLE_ERROR(cudaEventRecord(stop, 0));
27     HANDLE_ERROR(cudaEventSynchronize(stop));
28     HANDLE_ERROR(cudaEventElapsedTime(&elapsedTime, start, stop));
29     free(a);
30     HANDLE_ERROR(cudaFree(dev_a));
31     HANDLE_ERROR(cudaEventDestroy(start));
32     HANDLE_ERROR(cudaEventDestroy(stop));
33
34     return elapsedTime;
35 }
36
37 float cuda_host_alloc_test(int size, bool up){
38     cudaEvent_t start, stop;
39     int *a, *dev_a;
40     float elapsedTime;
41
42     HANDLE_ERROR(cudaEventCreate(&start));
43     HANDLE_ERROR(cudaEventCreate(&stop));
44
45     HANDLE_ERROR(cudaHostAlloc((void **)&a, size * sizeof(*a), cudaHostAllocDefault));
46     HANDLE_ERROR(cudaMalloc((void**)&dev_a, size * sizeof(*dev_a)));
47
48     HANDLE_ERROR(cudaEventRecord(start, 0));
49     for (int i = 0; i < 100; i++){
50         if (up)
51             HANDLE_ERROR(cudaMemcpy(dev_a, a, size * sizeof(*a), cudaMemcpyHostToDevice));
52         else
53             HANDLE_ERROR(cudaMemcpy(a, dev_a, size * sizeof(*a), cudaMemcpyDeviceToHost));
54     }
55     HANDLE_ERROR(cudaEventRecord(stop, 0));
56     HANDLE_ERROR(cudaEventSynchronize(stop));
57     HANDLE_ERROR(cudaEventElapsedTime(&elapsedTime, start, stop));
58
59     HANDLE_ERROR(cudaFreeHost(a));
60     HANDLE_ERROR(cudaFree(dev_a));
61     HANDLE_ERROR(cudaEventDestroy(start));
62     HANDLE_ERROR(cudaEventDestroy(stop));
63
64     return elapsedTime;
65 }
66
67 int main(void){
68     float elapsedTime;
69     float MB = (float)100 * SIZE*sizeof(int) / 1024 / 1024;
70     elapsedTime = cuda_malloc_test(SIZE, true);
71     printf("Time using cudaMalloc: %3.1f ms\n", elapsedTime);
72     printf("\tMB/s during copy up: %3.1f\n", MB / (elapsedTime / 1000));
73
74     elapsedTime = cuda_malloc_test(SIZE, false);
75     printf("Time using cudaMalloc: %3.1f ms\n", elapsedTime);
76     printf("\tMB/s during copy down: %3.1f\n", MB / (elapsedTime / 1000));
77
78     elapsedTime = cuda_host_alloc_test(SIZE, true);
79     printf("Time using cudaHostAlloc: %3.1f ms\n", elapsedTime);
80     printf("\tMB/s during copy up: %3.1f\n", MB / (elapsedTime / 1000));
81
82     elapsedTime = cuda_host_alloc_test(SIZE, false);
83     printf("Time using cudaHostAlloc: %3.1f ms\n", elapsedTime);
84     printf("\tMB/s during copy down: %3.1f\n", MB / (elapsedTime / 1000));
85 }

时间: 2024-08-08 09:39:19

CUDA实例练习(九):页锁定主机内存的相关文章

CUDA实例练习(十一):零拷贝内存

可以在CUDA C核函数中直接访问这种类型的主机内存.由于这种内存不需要复制到GPU,因此也称为零拷贝内存. 1 #include "book.h" 2 #include <stdio.h> 3 #include <cuda_runtime.h> 4 #include <device_launch_parameters.h> 5 #define imin(a,b) (a<b?a:b) 6 7 const int N = 33 * 1024 *

CUDA实例练习(十):多个cuda流

1 #include <stdio.h> 2 #include <cuda_runtime.h> 3 #include <device_launch_parameters.h> 4 #include "book.h" 5 6 #define N (1024*1024) 7 #define FULL_DATA_SIZE (N * 20) 8 9 __global__ void kernel(int *a, int *b, int *c){ 10 int

Bootstrap历练实例:标签页内的下拉菜单

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Bootstrap历练实例:标签页内的下拉菜单</title> <meta charset="utf-8" /> <meta name="vie

sql server 数据页缓冲区的内存瓶颈分析

查看数据库的计数器: SELECT * FROM  sys.dm_os_performance_counters **也可以使用系统的性能计监测器查看. 右键图表-> 添加计数器. 添加要监控的项 计数器中一些项的说明 : http://www.cnblogs.com/flysun0311/archive/2012/02/29/2373390.html 资料: http://www.cnblogs.com/Joe-T/archive/2012/07/31/2617060.html http://

操作系统内存管理之 分页与虚存(页表、页框、内存)

一 页面与页表 1 页面 分页存储管理是将作业的逻辑地址划分为一系列同等大小的部分,称为页.并为各页加以编号,每个作业的页的编号都是从0开始的.与之类似,把可用的物理内存也划分为同样大小的连续的部分,称为块或页框.同样为块也进行标号,从0#开始.在为进程分配内存空间时,以页为单位,每个内存中的块存放一页用户作业.只要内存中有足够多的块,这些块可以相邻也可以不相邻,就可以存放整个作业了. 页面的大小对于内存利用和系统开销来说非常重要,页面太大,在作业的最后一页必然会剩余较大不能利用的空间--内碎片

CUDA:零拷贝主机内存

The easy way to achieve copy/compute overlap!1.Enable Host Mapping* Runtime: cudaSetDeviceFlags() with cudaDeviceMapHost flag Driver : cuCtxCreate() with CU_CTX_MAP_HOST 2.Allocate pinned CPU memory Runtime: cudaHostAlloc(), use cudaHostAllocMapped f

运行CUDA实例时候出现的问题

问题一:>LINK : fatal error LNK1123: 转换到 COFF 期间失败:文件无效或损坏 将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否” 问题二:vs2010正在为 .dll加载符号 -工具---选项----调试----符号,看右边有个“Microsoft符号服务器”,将前面的勾去掉, 问题三:解决办法 此问题可能是由配置更改或安装另一个扩展导致.. 先输入devenv回车,会出现vs的启动界面,关掉 然后再输入devenv /reset

linux内核--段页式管理内存的方法

一.概念 物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应. --这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一 个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址 方式并不是这样.所以,说它是"与地址总线相对应",是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理

openstack主机内存ram超额分配

openstack提供资源利用率的方式一种主要途径是创建虚拟机时对内存进行超额分配.在对物理主机的选择策略如下代码所示:     def host_passes(self, host_state, filter_properties):         """Only return hosts with sufficient available RAM."""         instance_type = filter_properties.g