runBenchmarkGPU function

void runBenchmarkGPU(
  1. String name,
  2. TapeLayer layer,
  3. GPUTensor input,
  4. int iterations,
  5. double flopsPerIter,
  6. double bytesPerIter,
)

Implementation

void runBenchmarkGPU(
    String name,
    TapeLayer layer,
    GPUTensor<dynamic> input,
    int iterations,
    double flopsPerIter,
    double bytesPerIter) {
  CommandBuffer tape = CommandBuffer();
  CommandBuffer backwardTape = CommandBuffer();
  List<GPUTensor> intermediates = <GPUTensor>[];

  // Warmup pass
  GPUTensor<dynamic> outWarmup = layer.call(input, tape, intermediates);
  outWarmup.backward(backwardTape);
  CudaEngine.run(tape.bytes());
  CudaEngine.run(backwardTape.bytes());

  outWarmup.free();
  for (int i = 0; i < intermediates.length; i = i + 1) {
    intermediates[i].free();
  }
  intermediates.clear();
  tape.clear();
  backwardTape.clear();

  Stopwatch watch = Stopwatch();
  watch.start();

  for (int i = 0; i < iterations; i = i + 1) {
    GPUTensor<dynamic> out = layer.call(input, tape, intermediates);
    out.backward(backwardTape);

    CudaEngine.run(tape.bytes());
    CudaEngine.run(backwardTape.bytes());

    out.free();
    for (int k = 0; k < intermediates.length; k = k + 1) {
      intermediates[k].free();
    }
    intermediates.clear();
    tape.clear();
    backwardTape.clear();
  }

  watch.stop();

  double totalTimeSec = watch.elapsedMilliseconds / 1000.0;
  double avgTimeMs = watch.elapsedMilliseconds / iterations;
  double avgTimeSec = totalTimeSec / iterations;

  double tflops = (flopsPerIter / avgTimeSec) / 1000000000000.0;
  double gbps = (bytesPerIter / avgTimeSec) / 1000000000.0;

  print('$name:');
  print('  -> Time:  ${avgTimeMs.toStringAsFixed(3)} ms / iter');
  print('  -> Perf:  ${tflops.toStringAsFixed(4)} TFLOP/s');
  print('  -> Mem:   ${gbps.toStringAsFixed(2)} GB/s');
}