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';
}