给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; }
原文地址:http://blog.csdn.net/lingerlanlan/article/details/24649293