首页 > 代码库 > gpu数组赋值各种方法性能测试

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


给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;
}



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