gpu数组赋值各种方法性能测试

来源:互联网 发布:剑侠情缘网络单机版1 编辑:程序博客网 时间:2024/05/23 21:15


给gpu一个10000大小的数组赋值,

为了测量时间,要重复计算若干次。


备选方案:

1 先用cpu赋值,再拷贝过去
2 直接用cudaMemcpy逐个拷贝元素
3 启动核函数,多线程赋值


1和2的对比:

规模比较小的时候,2比较快,

规模变大的时候,1比较快。

所以如果是对一个值赋值,还是用cudaMemcpy比较好。


1和3的对比:

明显是3快,至于快多少,看数据。

100000次,10000大小数组的赋值。

1:main Time to generate:  9410.0 ms
3:main Time to generate:  20.0 ms



#include <stdlib.h>#include <stdio.h>#include <vector>#include <numeric>#include <iostream>using namespace std;__global__ void assignGpu(float* array,int array_size){for(int tid = blockIdx.x*blockDim.x+threadIdx.x;tid<array_size;tid += gridDim.x*blockDim.x){array[tid] = 2;}}void showArrayGpu(float*dev_array,int array_size){float* host_array = (float*)malloc(sizeof(float)*array_size);cudaMemcpy(host_array,dev_array,sizeof(float)*array_size,cudaMemcpyDeviceToHost);for(int i=0;i<array_size;i++){cout<<i<<":"<<host_array[i]<<endl;}}int main(void){clock_t start,stop;float   elapsedTime;int rounds = 100000;//给gpu一个1000大小的数组赋值int array_size = 10000;float* dev_array;float* host_array = (float*)malloc(sizeof(float)*array_size);for(int i=0;i<array_size;i++){host_array[i] = 1;}start = clock();    for(int round=0;round<rounds;round++)    {//先在cpu初始化,再拷贝过去    /*    for(int i=0;i<array_size;i++)    {    host_array[i] = 1;    }    */cudaMalloc((void**)&dev_array,sizeof(float)*array_size);cudaMemcpy(dev_array,host_array,sizeof(float)*array_size,cudaMemcpyHostToDevice);cudaFree(dev_array);//showArrayGpu(dev_array,array_size);    }stop= clock();    elapsedTime = (float)(stop - start) /                          (float)CLOCKS_PER_SEC * 1000.0f;    printf( "1:main Time to generate:  %3.1f ms\n", elapsedTime );    /*    start = clock();//直接 用cudaMemcpy    for(int round=0;round<rounds;round++)    {for(int i=0;i<array_size;i++){float temp = 2;cudaMemcpy(dev_array+i,&temp,sizeof(float),cudaMemcpyHostToDevice);}    }stop= clock();    elapsedTime = (float)(stop - start) /                          (float)CLOCKS_PER_SEC * 1000.0f;    printf( "2:main Time to generate:  %3.1f ms\n", elapsedTime );//showArrayGpu(dev_array,array_size);*/    start = clock();    for(int round=0;round<rounds;round++)    {    //启动核函数    assignGpu<<<100,100>>>(dev_array,array_size);    }    cudaDeviceSynchronize();stop= clock();    elapsedTime = (float)(stop - start) /                          (float)CLOCKS_PER_SEC * 1000.0f;    printf( "3:main Time to generate:  %3.1f ms\n", elapsedTime );return 0;}



0 0
原创粉丝点击