Blame projects/neural/benchmark.segment.inc.cpp

Ivan Mahonin e4740d
Ivan Mahonin e4740d
#include "segment.inc.cpp"
Ivan Mahonin e4740d
#include "segment.test.inc.cpp"
Ivan Mahonin e4740d
#include "segment.cx4.inc.cpp"
Ivan Mahonin e4740d
Ivan Mahonin e4740d
Ivan Mahonin e4740d
class BenchmarkSegment {
Ivan Mahonin e4740d
public:
Ivan Mahonin e4740d
  static std::vector<NeuronReal> values;
Ivan Mahonin e4740d
  static std::vector<Weight> weights;
Ivan Mahonin e4740d
  
Ivan Mahonin e4740d
  static void runSegment(const char *name, Segment &s, int threads, int repeats, bool backpass) {
Ivan Mahonin e4740d
    class H: public ThreadControl {
Ivan Mahonin e4740d
    public:
Ivan Mahonin e4740d
      Segment &s;
Ivan Mahonin e4740d
      int repeats;
Ivan Mahonin e4740d
      NeuronReal ratio;
Ivan Mahonin e4740d
      std::vector<Quality> qualities;
Ivan Mahonin e4740d
      
Ivan Mahonin e4740d
      H(Segment &s, int repeats, NeuronReal ratio): s(s), repeats(repeats), ratio(ratio) { }
Ivan Mahonin e4740d
      
Ivan Mahonin e4740d
      void threadFunc(Barrier &barrier) override {
Ivan Mahonin e4740d
        Segment &s = this->s;
Ivan Mahonin e4740d
        Layout l = s.layout;
Ivan Mahonin e4740d
        NeuronReal r = ratio;
Ivan Mahonin e4740d
        int sx = l.getW() - s.sx + 1;
Ivan Mahonin e4740d
        int sy = l.getH() - s.sy + 1;
Ivan Mahonin e4740d
        int sz = l.getD() - s.sz + 1;
Ivan Mahonin e4740d
        
Ivan Mahonin e4740d
        Quality q;
Ivan Mahonin e4740d
        for(int i = 0; i < repeats; ++i) {
Ivan Mahonin e4740d
          int x = l.x0 + barrier.commonRand()%sx;
Ivan Mahonin e4740d
          int y = l.y0 + barrier.commonRand()%sy;
Ivan Mahonin e4740d
          int z = l.z0 + barrier.commonRand()%sz;
Ivan Mahonin e4740d
          q += s.pass(barrier, x, y, z, r);
Ivan Mahonin e4740d
          barrier.wait();
Ivan Mahonin e4740d
        }
Ivan Mahonin e4740d
        qualities[barrier.tid] = q;
Ivan Mahonin e4740d
      }
Ivan Mahonin e4740d
    } h(s, repeats, backpass ? 1 : 0);
Ivan Mahonin e4740d
    
Ivan Mahonin e4740d
    int cnt = s.layout.getCount();
Ivan Mahonin e4740d
    values.resize(cnt);
Ivan Mahonin e4740d
    weights.resize(s.weightsCount);
Ivan Mahonin e4740d
    s.f_values = values.data();
Ivan Mahonin e4740d
    s.weights = weights.data();
Ivan Mahonin e4740d
Ivan Mahonin e4740d
    for(int i = 0; i < cnt; ++i)
Ivan Mahonin e4740d
      s.f_values[i] = rand()/(NeuronReal)RAND_MAX;
Ivan Mahonin e4740d
    for(int i = 0; i < s.weightsCount; ++i)
Ivan Mahonin e4740d
      s.weights[i].w = rand()/(WeightReal)RAND_MAX;
Ivan Mahonin e4740d
    h.qualities.resize(threads);
Ivan Mahonin e4740d
    
Ivan Mahonin e4740d
    volatile long long t0 = timeUs();
Ivan Mahonin e4740d
    h.runThreads(threads);
Ivan Mahonin e4740d
    volatile long long t1 = timeUs();
Ivan Mahonin e4740d
Ivan Mahonin e4740d
    AccumReal sum = 0;
Ivan Mahonin e4740d
    for(int i = 0; i < threads; ++i) sum += h.qualities[i].train + h.qualities[i].human;
Ivan Mahonin e4740d
    for(int i = 0; i < s.weightsCount; ++i) sum += s.weights[i].w;
Ivan Mahonin e4740d
    
Ivan Mahonin e4740d
    printf("%s %d: %f, %lld\n", name, (int)backpass, (t1 - t0)*1e-6, (long long)sum);
Ivan Mahonin e4740d
  }
Ivan Mahonin e4740d
Ivan Mahonin e4740d
Ivan Mahonin e4740d
  static void runSegment(const char *name, Segment &s, int threads, int repeats) {
Ivan Mahonin e4740d
    runSegment(name, s, threads, repeats, false);
Ivan Mahonin e4740d
    runSegment(name, s, threads, repeats, true);
Ivan Mahonin e4740d
  }
Ivan Mahonin e4740d
Ivan Mahonin e4740d
  
Ivan Mahonin e4740d
  static void runSegment(const char *name, Segment &s, int threads) {
Ivan Mahonin e4740d
    int repeats = (int)( (1ll*1000*1000*1000 + s.effectiveLinks/2)/s.effectiveLinks );
Ivan Mahonin e4740d
    if (!SegmentTest::testSegment(name, s)) return;
Ivan Mahonin e4740d
    runSegment(name, s, threads, repeats, false);
Ivan Mahonin e4740d
    runSegment(name, s, threads, repeats, true);
Ivan Mahonin e4740d
  }
Ivan Mahonin e4740d
  
Ivan Mahonin e4740d
  
Ivan Mahonin e4740d
  static void run(int threads) {
Ivan Mahonin e4740d
    { SegmentCx4 s(3, 24); s.layout = Layout(514, 514,  3).expandXY(2);
Ivan Mahonin e4740d
      runSegment("cx4-3x24", s, threads); }
Ivan Mahonin e4740d
  }
Ivan Mahonin e4740d
};
Ivan Mahonin e4740d
Ivan Mahonin e4740d
Ivan Mahonin e4740d
std::vector<NeuronReal> BenchmarkSegment::values;
Ivan Mahonin e4740d
std::vector<Weight> BenchmarkSegment::weights;
Ivan Mahonin e4740d
Ivan Mahonin e4740d