summaryrefslogtreecommitdiff
path: root/src/kernels/level2/xgemv_fast.opencl
diff options
context:
space:
mode:
authorCedric Nugteren <web@cedricnugteren.nl>2017-12-05 20:39:49 +0100
committerCedric Nugteren <web@cedricnugteren.nl>2017-12-05 20:39:49 +0100
commit0f9637bbac6248a381d7012d7224331d3d394efb (patch)
tree958093804cd0f1be907a2b748c0477fd811cbb35 /src/kernels/level2/xgemv_fast.opencl
parentcf4555d1f44aea9c82b60211b5650b6b77a1226c (diff)
Improved array-to-register promotion, now handling function calls as well
Diffstat (limited to 'src/kernels/level2/xgemv_fast.opencl')
-rw-r--r--src/kernels/level2/xgemv_fast.opencl76
1 files changed, 38 insertions, 38 deletions
diff --git a/src/kernels/level2/xgemv_fast.opencl b/src/kernels/level2/xgemv_fast.opencl
index 892bc55c..45ceb36c 100644
--- a/src/kernels/level2/xgemv_fast.opencl
+++ b/src/kernels/level2/xgemv_fast.opencl
@@ -106,10 +106,10 @@ void XgemvFast(const int m, const int n,
// Initializes the accumulation registers
#pragma promote_to_registers
- real acc[WPT2];
+ real acc2[WPT2];
#pragma unroll
for (int _w = 0; _w < WPT2; _w += 1) {
- SetToZero(acc[_w]);
+ SetToZero(acc2[_w]);
}
// Loops over work-group sized portions of the work
@@ -131,41 +131,41 @@ void XgemvFast(const int m, const int n,
const int gid = (WPT2/VW2)*get_global_id(0) + _w;
realVF avec = agm[(a_ld/VW2)*k + gid];
#if VW2 == 1
- MultiplyAdd(acc[VW2*_w+0], xlm[_kl], avec);
+ MultiplyAdd(acc2[VW2*_w+0], xlm[_kl], avec);
#elif VW2 == 2
- MultiplyAdd(acc[VW2*_w+0], xlm[_kl], avec.x);
- MultiplyAdd(acc[VW2*_w+1], xlm[_kl], avec.y);
+ MultiplyAdd(acc2[VW2*_w+0], xlm[_kl], avec.x);
+ MultiplyAdd(acc2[VW2*_w+1], xlm[_kl], avec.y);
#elif VW2 == 4
- MultiplyAdd(acc[VW2*_w+0], xlm[_kl], avec.x);
- MultiplyAdd(acc[VW2*_w+1], xlm[_kl], avec.y);
- MultiplyAdd(acc[VW2*_w+2], xlm[_kl], avec.z);
- MultiplyAdd(acc[VW2*_w+3], xlm[_kl], avec.w);
+ MultiplyAdd(acc2[VW2*_w+0], xlm[_kl], avec.x);
+ MultiplyAdd(acc2[VW2*_w+1], xlm[_kl], avec.y);
+ MultiplyAdd(acc2[VW2*_w+2], xlm[_kl], avec.z);
+ MultiplyAdd(acc2[VW2*_w+3], xlm[_kl], avec.w);
#elif VW2 == 8
- MultiplyAdd(acc[VW2*_w+0], xlm[_kl], avec.s0);
- MultiplyAdd(acc[VW2*_w+1], xlm[_kl], avec.s1);
- MultiplyAdd(acc[VW2*_w+2], xlm[_kl], avec.s2);
- MultiplyAdd(acc[VW2*_w+3], xlm[_kl], avec.s3);
- MultiplyAdd(acc[VW2*_w+4], xlm[_kl], avec.s4);
- MultiplyAdd(acc[VW2*_w+5], xlm[_kl], avec.s5);
- MultiplyAdd(acc[VW2*_w+6], xlm[_kl], avec.s6);
- MultiplyAdd(acc[VW2*_w+7], xlm[_kl], avec.s7);
+ MultiplyAdd(acc2[VW2*_w+0], xlm[_kl], avec.s0);
+ MultiplyAdd(acc2[VW2*_w+1], xlm[_kl], avec.s1);
+ MultiplyAdd(acc2[VW2*_w+2], xlm[_kl], avec.s2);
+ MultiplyAdd(acc2[VW2*_w+3], xlm[_kl], avec.s3);
+ MultiplyAdd(acc2[VW2*_w+4], xlm[_kl], avec.s4);
+ MultiplyAdd(acc2[VW2*_w+5], xlm[_kl], avec.s5);
+ MultiplyAdd(acc2[VW2*_w+6], xlm[_kl], avec.s6);
+ MultiplyAdd(acc2[VW2*_w+7], xlm[_kl], avec.s7);
#elif VW2 == 16
- MultiplyAdd(acc[VW2*_w+0], xlm[_kl], avec.s0);
- MultiplyAdd(acc[VW2*_w+1], xlm[_kl], avec.s1);
- MultiplyAdd(acc[VW2*_w+2], xlm[_kl], avec.s2);
- MultiplyAdd(acc[VW2*_w+3], xlm[_kl], avec.s3);
- MultiplyAdd(acc[VW2*_w+4], xlm[_kl], avec.s4);
- MultiplyAdd(acc[VW2*_w+5], xlm[_kl], avec.s5);
- MultiplyAdd(acc[VW2*_w+6], xlm[_kl], avec.s6);
- MultiplyAdd(acc[VW2*_w+7], xlm[_kl], avec.s7);
- MultiplyAdd(acc[VW2*_w+8], xlm[_kl], avec.s8);
- MultiplyAdd(acc[VW2*_w+9], xlm[_kl], avec.s9);
- MultiplyAdd(acc[VW2*_w+10], xlm[_kl], avec.sA);
- MultiplyAdd(acc[VW2*_w+11], xlm[_kl], avec.sB);
- MultiplyAdd(acc[VW2*_w+12], xlm[_kl], avec.sC);
- MultiplyAdd(acc[VW2*_w+13], xlm[_kl], avec.sD);
- MultiplyAdd(acc[VW2*_w+14], xlm[_kl], avec.sE);
- MultiplyAdd(acc[VW2*_w+15], xlm[_kl], avec.sF);
+ MultiplyAdd(acc2[VW2*_w+0], xlm[_kl], avec.s0);
+ MultiplyAdd(acc2[VW2*_w+1], xlm[_kl], avec.s1);
+ MultiplyAdd(acc2[VW2*_w+2], xlm[_kl], avec.s2);
+ MultiplyAdd(acc2[VW2*_w+3], xlm[_kl], avec.s3);
+ MultiplyAdd(acc2[VW2*_w+4], xlm[_kl], avec.s4);
+ MultiplyAdd(acc2[VW2*_w+5], xlm[_kl], avec.s5);
+ MultiplyAdd(acc2[VW2*_w+6], xlm[_kl], avec.s6);
+ MultiplyAdd(acc2[VW2*_w+7], xlm[_kl], avec.s7);
+ MultiplyAdd(acc2[VW2*_w+8], xlm[_kl], avec.s8);
+ MultiplyAdd(acc2[VW2*_w+9], xlm[_kl], avec.s9);
+ MultiplyAdd(acc2[VW2*_w+10], xlm[_kl], avec.sA);
+ MultiplyAdd(acc2[VW2*_w+11], xlm[_kl], avec.sB);
+ MultiplyAdd(acc2[VW2*_w+12], xlm[_kl], avec.sC);
+ MultiplyAdd(acc2[VW2*_w+13], xlm[_kl], avec.sD);
+ MultiplyAdd(acc2[VW2*_w+14], xlm[_kl], avec.sE);
+ MultiplyAdd(acc2[VW2*_w+15], xlm[_kl], avec.sF);
#endif
}
}
@@ -179,7 +179,7 @@ void XgemvFast(const int m, const int n,
for (int _w = 0; _w < WPT2; _w += 1) {
const int gid = WPT2*get_global_id(0) + _w;
real yval = ygm[gid*y_inc + y_offset];
- AXPBY(ygm[gid*y_inc + y_offset], alpha, acc[_w], beta, yval);
+ AXPBY(ygm[gid*y_inc + y_offset], alpha, acc2[_w], beta, yval);
}
}
@@ -214,8 +214,8 @@ void XgemvFastRot(const int m, const int n,
__local real xlm[WPT3];
// Initializes the accumulation register
- real acc;
- SetToZero(acc);
+ real acc3;
+ SetToZero(acc3);
// Loops over tile-sized portions of the work
for (int kwg=0; kwg<n; kwg+=WPT3) {
@@ -280,7 +280,7 @@ void XgemvFastRot(const int m, const int n,
for (int _v = 0; _v < VW3; _v += 1) {
real aval = tile[lid_mod*VW3 + _v][lid_div * (WPT3/VW3) + _kl];
real xval = xlm[_kl*VW3 + _v];
- MultiplyAdd(acc, xval, aval);
+ MultiplyAdd(acc3, xval, aval);
}
}
@@ -291,7 +291,7 @@ void XgemvFastRot(const int m, const int n,
// Stores the final result
const int gid = get_global_id(0);
real yval = ygm[gid * y_inc + y_offset];
- AXPBY(ygm[gid * y_inc + y_offset], alpha, acc, beta, yval);
+ AXPBY(ygm[gid * y_inc + y_offset], alpha, acc3, beta, yval);
}
// =================================================================================================