两种算法,性能差别在哪里?

最近测试了点东西。
对于一个20480512(M)大小的数据,应用GPU,对每个元素做f(x)操作。(f是比较简单的操作,exp、+、)等。
我有几种算法:
一种是一个block有512个thread,每个thread算1个数据,设置20480个block;
一种是一个block有512个thread,每个thread算640(N,可变)个数据,设置20480/640个block;
代码如下:
global void kernel_rn0(float A,int M){
int tidx,bidx;
int bdimx;
int num;
float tmp;
int j;
tidx=threadIdx.x;
bidx=blockIdx.x;
bdimx=blockDim.x;
num=bidx
bdimx+tidx;
if(tidx<M)
tmp=A[num];
for(j=0;j<1;j++)
tmp=exp(tmp);
A[num]=tmp;
}

global void kernel_rn1(float A,int M,int N){
int tidx,bidx;
int bdimx;
int num;
int i;
float tmp;
int j;
tidx=threadIdx.x;
bidx=blockIdx.x;
bdimx=blockDim.x;
for(i=0;i<N;i++){
num=(bidx
N+i)*bdimx+tidx;
if(tidx<M)
tmp=A[num];
for(j=0;j<1;j++)
tmp=exp(tmp);
A[num]=tmp;
}
}

用profiler测试,第二种(1.025ms)比第一种(1.508ms)速度快,想不明白快在哪里了?

第一种情况,需要访存的warp非常多,而计算量不够所以导致无法有效的隐藏访存的时间消耗。第二种情况虽然warp少了,但是计算量能较好的掩盖访存时间,因此时间反而少了。所以主要原因是计算量不够而导致时间全部消耗在访存上了!

回答的很简单,欢迎其他人补充或指出问题!