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;
}
时间: 2024-10-12 19:53:24

gpu数组赋值各种方法性能测试的相关文章

给字符数组赋值的方法

main() { char s[30]; strcpy(s, "Good News!"); /*给数组赋字符串*/ . . . } 上面程序在编译时, 遇到char s[30]这条语句时, 编译程序会在内存的某处留 出连续30个字节的区域, 并将第一个字节的地址赋给s.当遇到strcpy( strcpy 为 Turbo C2.0的函数)时, 首先在目标文件的某处建立一个"Good News!/0" 的字符串. 当中/0表示字符串终止, 终止符是编译时自己主动加上的,

forEach() map() some() [数组的扩充方法]

2.7.1 arr.forEach() 参数及含义 var arr = [ 'a' , 'b' , 'c' , 'd' , 'e' ] ; var rt = arr.forEach( function( a , b , c){    console.log( '三个参数' , a , b , c );} ) ; console.log( '返回值' , rt ); 第1个参数是数组里的每个元素 第2个参数是索引 第3个参数是原数组 特点 1> forEach 方法按升序为数组中含有效值的每一项执

javascript数组赋值操作

最近在司徒正美的<javascript框架设计>,在里面发现了一个段代码 1 ...... 2 3 var _len = arr1.length; 4 while (_len) { 5 arr2[--_len] = arr1[_len]; 6 } 7 8 ...... 这是一个数组间赋值的操作,咋一看,之前还没碰到这样的写法.平时我个人都是这样写的. 1 function assignment2(arr1, arr2) { 2 for (var i = 0,_len = arr1.length

PHP数组的使用方法小结

数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体.数组的每个实体都包含两项:键和值. 一.什么是数组数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体.数组的每个实体都包含两项:键和值.二.声明数据在PHP中声明数组的方式主要有两种:一是应用array()函数声明数组,一是直接为数组元素赋值.<1>array()函数声明的数组的方式array([mixed...]) 参数mixed的语法为key=>value如, <?php$array=array

js 删除数组几种方法

var arr=['a','b','c']; 若要删除其中的'b',有两种方法: 1.delete方法:delete arr[1] 这种方式数组长度不变,此时arr[1]变为undefined了,但是也有好处原来数组的索引也保持不变,此时要遍历数组元素可以才用 for(index in arr){  document.write('arr['+index+']='+arr[index]);} 这种遍历方式跳过其中undefined的元素 * 该方式IE4.o以后都支持了 2.数组对象splice

ES6中数组的新方法

数组的扩展 1.1扩展运算符 1.1.1:... 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. <body> <div></div> <div></div> <div></div> <div></div> </body> <script type="text/javascript"> c

字符数组赋值『转载』

main() { char s[30]; strcpy(s, "Good News!"); /*给数组赋字符串*/ . . . } 上面程序在编译时, 遇到char s[30]这条语句时, 编译程序会在内存的某处留 出连续30个字节的区域, 并将第一个字节的地址赋给s.当遇到strcpy( strcpy 为 Turbo C2.0的函数)时, 首先在目标文件的某处建立一个"Good News!/0" 的字符串. 其中/0表示字符串终止, 终止符是编译时自动加上的, 然

数组赋值变化

1.var arr = ["One","Two","Three"]; var arrto = arr;arrto[1] = "test";document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,test,Threedocument.writeln("数组的新值:" + arrto +

js数组高阶方法reduce经典用法代码分享

以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘. javascript数组那么多方法,为什么我要单挑reduce方法,一个原因是我对这个方法掌握不够,不能够用到随心所欲.另一个方面,我也感觉到了这个方法的庞大魅力,在许多的场景中发挥着神奇的作用. 理解reduce函数 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. a