因为图像直方图程序中一个线程负责统计64个像素点的亮度值统计,所以有像素索引自加操作,这个应该算整数加法指令;通过三通道灰度值计算亮度值涉及到浮点数与整数相乘,以及结果相加,这里涉及到浮点加法指令;最后涉及亮度值得统计涉及到原子加法操作,这里涉及整数加法指令操作。由于程序不仅涉及浮点乘法指令和加法指令,又涉及到整数加法指令。由于基本指令吞吐率整数加法和浮点数加法及乘法指令不一样,导致最后既不能与整数和逻辑运算峰值比较,也不能和浮点运算峰值比较。这个怎么办,求版主解惑。
代码如下:
for(i=0;i<LOOP_N;i++)//LOOP_N=64
{
if(offset<(w)(h))
{
r=((uchar)ri)[offset];
g=((uchar*)gi)[offset];
b=((uchar*)bi)[offset];
offset++;
u=(unsigned char)(0.299fr+0.587fg+0.114fb);
atomicAdd((int)&smem,1);
}
}
求版主解惑。。。。。
LZ您好:
浮点峰值也罢,整点峰值也罢,指令吞吐率也罢,都仅仅是非常局限的参数,对于具体的问题和算法实现,往往已经限定了其中的指令配比,访存和计算比例等。您不能从实际实现的混合状态中剥离出来一项和理论值比较。理论峰值存在的意义仅仅是为了给您在设计算法实现的时候提供一个参考。
同时,严格地说,完成同样的问题,最终速度快的方法才是好方法,而不一定指令吞吐量高的方法。因为有些不合理的算法实现,虽然指令用了很多,吞吐量也很高,但是是在白忙活。
一般优化的顺序遵循于:正确实现——保证访存效率——profiling发现瓶颈并解决。
如果瓶颈在于访存,请考虑尽量合并+各种高速缓冲。
如果瓶颈在于计算,请考虑能否优化算法减小计算量+有没有计算复杂并多次使用的数据以及这些数据计算一次并保存起来多次使用是否划算+是否因为指令吞吐率的限制或者指令配比的情况影响了速度等。
所有这些优化中,算法层面的改进往往能提供最大的好处。
大致如此,望您不再纠结。