runBenchmarkGPU function
void
runBenchmarkGPU()
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');
}