自己写了一段小代码,因为看好多资料都说GPU的一个thread相对较弱,所以想知道一下它到底有多弱,当然我的这个例子也不能说明什么问题,一个是GPU的运算时间包含了数据传输的时间,另一个原因是我的累加算法实在是太小了,恐怕对于GPU的一个线程来说也没有太大的负担,但是在运行的过程中,我却发现了另一个问题:
为什么kernel函数中的执行顺序不是按照我理解的来的呢?代码如下:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <time.h>
float cpu_sum(int N)
{
float sum=0.0;
for(int i=0;i<N;i++)
{
sum=sum+i;
}
printf("CPU的计算结果:%f\n",sum);
return sum;
}
__global__ void gpu_sum(int* M)
{
float gsum=0.0;
for(int i=0;i<M[0];i++)
{
gsum=gsum+i;
}
printf("gpu result is:%f\n",gsum);
}
void main()
{
clock_t t0,t1,t2,t3;
t0=clock();
float csum=cpu_sum(10000);
t1=clock();
printf("%d\n",t1-t0);
int h[1];
h[0]=10000;
int *dev;
t2=clock();
cudaMalloc((void**)&dev,sizeof(int));
cudaMemcpy(dev,h,sizeof(int),cudaMemcpyHostToDevice);
gpu_sum<<<1,1>>>(dev);
t3=clock();
printf("%d\n",t3-t2);
cudaFree(dev);
}
执行的结果如图:
[attach]3006[/attach]
按照我的理解,它不是应该先执行kernel中的print(),然后再执行 printf(“%d\n”,t3-t2);吗?难道是异步执行了?
我设想的顺序应该是CPU的计算结果。。。、0、gpu result is。。。、65,最后两个的显示顺序和我想的相反!