/*测试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);
}
cuda——测试页锁定内存
最新推荐文章于 2025-02-06 17:36:53 发布