|
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 |
|