我有两个几乎相同的OpenCL内核,但有一些细微差别。一个内核执行256个FMA操作,另一个内核在循环体中执行512个操作。
以下是内核的一般结构:
__kernel void WGSXMAPIXLLXOPS8(const __global float * restrict GIn, __global float * restrict GOut, const float M, const float N, const float P) {
const int XGL = get_global_id(0);
const int XGRid = get_group_id(0);
const int XGRnum = get_num_groups(0);
const int XLSize = get_local_size(0);
const int XLid = get_local_id(0);
// Just a private variable
float MF = (float) XGL;
float NF = (float) N;
float PF = (float) P;
float tempOutTotal = 0;
// Start of a new level of for loop
for (int lcdd = 0; lcdd < 2; lcdd++) {
float temp1 = 1.0;
temp1 = temp1 * MF + temp1;
temp1 = temp1 * MF + temp1;
...
temp1 = temp1 * MF + temp1;
temp1 = temp1 * MF + temp1;
GOut[XGL] = temp1;
}
}
现在,我通过将浮点运算的总数除以完成它的时间来计算这些内核的GFlops。我在GPU上部署了141076个工作项。对于具有256个FMA操作的内核,我得到大约1696.5个GFlops,对于具有512个FMA操作的内核,我得到大约2043.74个生命值。
从我的角度来看,我有足够的并行性,并且我在内核中有足够的操作。除非我的假设是错误的。
现在的问题是:为什么在内核中有更多的操作可以提高性能?我知道并行性确实很重要,并且每个内核都应该做足够的操作。那么,究竟是什么导致了这种性能上的特定差距?
更具体地说,占用率与内核操作的数量和类型之间是否有任何关系?