conv.cpp 1.86 KB
Newer Older
Chao Liu's avatar
Chao Liu committed
1
#include <iostream>
Chao Liu's avatar
Chao Liu committed
2
3
#include "tensor.hpp"

Chao Liu's avatar
Chao Liu committed
4
5
6
7
8
template <typename T>
void direct_convolution(const Tensor<T>& in,
                        const Tensor<T>& wei,
                        Tensor<T>& out,
                        std::size_t num_thread)
Chao Liu's avatar
Chao Liu committed
9
{
Chao Liu's avatar
Chao Liu committed
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    auto f = [&](auto n, auto k, auto ho, auto wo) {
        double v = 0;
        for(int c = 0; c < wei.mDesc.GetLengths()[1]; ++c)
        {
            for(int y = 0; y < wei.mDesc.GetLengths()[2]; ++y)
            {
                int hi = ho + y;
                for(int x = 0; x < wei.mDesc.GetLengths()[3]; ++x)
                {
                    int wi = wo + x;
                    v += in(n, c, hi, wi) * wei(k, c, y, x);
                }
            }
        }
        out(n, k, ho, wo) = v;
    };
Chao Liu's avatar
Chao Liu committed
26

Chao Liu's avatar
Chao Liu committed
27
28
29
30
31
    auto f_par = make_ParallelTensorFunctor(f,
                                            out.mDesc.GetLengths()[0],
                                            out.mDesc.GetLengths()[1],
                                            out.mDesc.GetLengths()[2],
                                            out.mDesc.GetLengths()[3]);
Chao Liu's avatar
Chao Liu committed
32

Chao Liu's avatar
Chao Liu committed
33
    f_par(num_thread);
Chao Liu's avatar
Chao Liu committed
34
35
}

Chao Liu's avatar
Chao Liu committed
36
37
template <class T>
struct Generator
Chao Liu's avatar
Chao Liu committed
38
39
{

Chao Liu's avatar
Chao Liu committed
40
41
    template <class... Is>
    T operator()(Is... is)
Chao Liu's avatar
Chao Liu committed
42
    {
Chao Liu's avatar
Chao Liu committed
43
        return 1;
Chao Liu's avatar
Chao Liu committed
44
    }
Chao Liu's avatar
Chao Liu committed
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
};

int main()
{
    Tensor<float> in({3, 16, 128, 128});
    Tensor<float> wei({4, 16, 3, 3});
    Tensor<float> out({3, 4, 126, 126});

    int num_thread = std::thread::hardware_concurrency();

    std::cout << __func__ << ": num_thread " << num_thread << std::endl;

    in.GenerateTensorValue(Generator<float>{}, num_thread);
    wei.GenerateTensorValue(Generator<float>{}, num_thread);

    direct_convolution(in, wei, out, num_thread);

    std::cout << __func__ << ": done" << std::endl;

    LogRange(std::cout, in.mData, ",") << std::endl;
    LogRange(std::cout, wei.mData, ",") << std::endl;
    LogRange(std::cout, out.mData, ",") << std::endl;
Chao Liu's avatar
Chao Liu committed
67
}