| 1079 | |
| 1080 | template<typename T> |
| 1081 | double computeArraysRMSD(dim_t data_size, T *gold, T *data) { |
| 1082 | double accum = 0.0; |
| 1083 | double maxion = -FLT_MAX; //(double)std::numeric_limits<T>::lowest(); |
| 1084 | double minion = FLT_MAX; //(double)std::numeric_limits<T>::max(); |
| 1085 | |
| 1086 | for (dim_t i = 0; i < data_size; i++) { |
| 1087 | double dTemp = (double)data[i]; |
| 1088 | double gTemp = (double)gold[i]; |
| 1089 | double diff = gTemp - dTemp; |
| 1090 | if (diff > 1.e-4) { |
| 1091 | // printf("%d: diff: %f %f %f\n", i, diff, data[i], gold[i]); |
| 1092 | } |
| 1093 | double err = |
| 1094 | (std::isfinite(diff) && (std::abs(diff) > 1.0e-4)) ? diff : 0.0f; |
| 1095 | accum += std::pow(err, 2.0); |
| 1096 | maxion = std::max(maxion, dTemp); |
| 1097 | minion = std::min(minion, dTemp); |
| 1098 | } |
| 1099 | accum /= data_size; |
| 1100 | double NRMSD = std::sqrt(accum) / (maxion - minion); |
| 1101 | |
| 1102 | return NRMSD; |
| 1103 | } |
| 1104 | |
| 1105 | template<> |
| 1106 | double computeArraysRMSD<unsigned char>(dim_t data_size, unsigned char *gold, |