cuda——测试页锁定内存

/*测试cudaMemcpy()在可分页内存和页锁定内存上的性能差异
步骤:分配一个GPU缓冲区,以及一个同样大小的Host缓冲区,然后在这两个缓冲区上面进行一系列的复制操作。用户指定方向(从主机到GPU定义为up)
为了获得精确的时间统计,我们设计CUDA时间以进行测试*/
#include <stdio.h>
#define N 100//复制的次数
#define SIZE 1024*1024*10

/*在可分页内存上的测试*/
float malloc_test(int size,bool isup){
	cudaEvent_t start,stop;//cuda事件,来标定复制操作的起始时刻和终止时刻
	int *a,*d_a;
	float elapsedTime;
	a = (int*)malloc(size*sizeof(*a));//在主机上分配可分页内存
	cudaMalloc((void**)&d_a,size*sizeof(*d_a));
	cudaEventCreate(&start);
	cudaEventCreate(&stop);

	cudaEventRecord(start,0);
	for(int i = 0;i<N;i++)
		if(isup)//从主机复制到设备
			cudaMemcpy(d_a,a,size*sizeof(int),cudaMemcpyHostToDevice);
		else
			cudaMemcpy(a,d_a,size*sizeof(int),cudaMemcpyDeviceToHost);
	cudaEventRecord(stop,0);
	cudaEventSynchronize(stop);
	cudaEventElapsedTime(&elapsedTime,start,stop);
	free(a);
	cudaFree(d_a);
	cudaEventDestroy(start);
	cudaEventDestroy(stop);	
	return elapsedTime;
}

/*在可页锁定内存上的测试*/
float hostAlloc_test(int size,bool isup){
	cudaEvent_t start,stop;
	int *a,*d_a;
	float elapsedTime;
	cudaEventCreate(&start);
	cudaEventCreate(&stop);
	cudaHostAlloc((void**)&a,size*sizeof(*a),cudaHostAllocDefault);//在主机上分配页锁定内存
	cudaMalloc((void**)&d_a,size*sizeof(*d_a));
	cudaEventRecord(start,0);
	for(int i = 0;i<N;++i)
		if(isup)
			cudaMemcpy(d_a,a,size*sizeof(*a),cudaMemcpyHostToDevice);
		else
			cudaMemcpy(a,d_a,size*sizeof(*a),cudaMemcpyDeviceToHost);
	cudaEventRecord(stop,0);
	cudaEventSynchronize(stop);
	cudaEventElapsedTime(&elapsedTime,start,stop);
	cudaFreeHost(a);//释放页锁定内存的方法
	cudaFree(d_a);
	cudaEventDestroy(start);
	cudaEventDestroy(stop);
	return elapsedTime;
}
int main(){
	float elapsedTime;
	float MB=(float)N*SIZE*sizeof(int)/1024/1024;//总的数据移动量
	elapsedTime = malloc_test(SIZE,false);
	printf("%lf\n",MB/elapsedTime);
	elapsedTime = hostAlloc_test(SIZE,false);
	printf("%lf\n",MB/elapsedTime);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值