double diff_seq(cpx *seq, cpx *ref, float scalar, const int n) { if (seq == NULL) return 1; double mDiff = 0.0; double mVal = -1; cpx rScale{scalar, 0}; for (int i = 0; i < n; ++i) { cpx norm = cpx_mul(seq + i, &rScale); if (invalidCpx(norm)) return 1.0; #if defined(_NVIDIA) mVal = maxf(mVal, maxf(cuCabsf(norm), cuCabsf(ref[i]))); double tmp = cuCabsf(cuCsubf(norm, ref[i])); #else mVal = maxf(mVal, maxf(cpx_abs(norm), cpx_abs(ref[i]))); double tmp = cpx_abs(cpx_sub(&norm, ref + i)); #endif mDiff = tmp > mDiff ? tmp : mDiff; } return (mDiff / mVal); }
static inline __DH__ float abs(cfloat cval) { return cuCabsf(cval); }