/*测试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); }