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
- gpu数组赋值各种方法性能测试
- 字符数组赋值方法
- Telechips 6410 GPU JIT 性能测试对比
- Android性能专项测试之GPU Monitor
- Android性能专项测试之GPU Monitor
- Android性能专项测试之GPU Monitor
- Android性能专项测试之GPU Monitor
- 提高性能各种方法
- 几种C++多维数组管理方法的性能测试
- 几种C++多维数组管理方法的性能测试
- Mali GPU性能调优方法
- linux shell数组赋值方法
- c#中数组赋值方法
- linux shell数组赋值方法
- linux shell数组赋值方法
- c#中数组赋值方法
- 各种数组排序方法
- 基于docker的GPU测试方法
- 构造函数间调用图解
- 心在哪儿
- Unity3d数据加密
- Ubuntu 12.04安装Sun JDK(替代OpenJDK)
- 如何提高团队管理能力9
- gpu数组赋值各种方法性能测试
- 使用 Blobstore Java API 在Java App Engine 中存放大文件
- MySQL入门(1)--安装,配置,基本语法
- hadoop 2.2.0 运维
- Windows Socket五种IO模型
- 再次遇到谓词推入
- Hadoop作业JVM堆大小设置优化
- NYOJ 585 取石子(六)
- 五一带着WiFi共享精灵回家,路途不寂寞