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