File size: 1,624 Bytes
3fd1a35 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include "ling3/cpu_kernels.h"
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
int main() {
double worst = 0.0;
for (const int count : {1, 3, 4, 7, 128, 8193}) {
std::vector<float> input(count), up(count), out(count), inplace(count);
for (int i = 0; i < count; ++i) {
input[i] = 80.0F * std::sin(i * 0.013F);
up[i] = std::cos(i * 0.17F);
}
for (const bool multiply : {false, true}) {
inplace = input;
if (multiply) {
ling3::SiluMultiply(input.data(), up.data(), out.data(), count);
ling3::SiluMultiply(inplace.data(), up.data(), inplace.data(), count);
} else {
ling3::Silu(input.data(), out.data(), count);
ling3::Silu(inplace.data(), inplace.data(), count);
}
for (int i = 0; i < count; ++i) {
const double value = input[i];
const double expected = value / (1.0 + std::exp(-value)) *
(multiply ? static_cast<double>(up[i]) : 1.0);
const double error = std::abs(out[i] - expected) / std::max(1.0, std::abs(expected));
worst = std::max(worst, error);
if (!std::isfinite(out[i]) || out[i] != inplace[i] || error > 5e-7) {
std::cerr << "activation mismatch count=" << count << " index=" << i
<< " error=" << error << '\n';
return 1;
}
}
}
}
std::cout << "max_scaled_error=" << worst << '\n';
}
|