From f72afde1a144a7cf9c1ed68885a9dc3acc66fc05 Mon Sep 17 00:00:00 2001 From: xzgao Date: Fri, 29 Sep 2023 03:41:11 +0000 Subject: [PATCH] moved benchmark to a new repo --- README.md | 6 +++-- benchmark/benchmark.png | Bin 55908 -> 0 bytes benchmark/benchmark_plot.py | 43 ------------------------------------ 3 files changed, 4 insertions(+), 45 deletions(-) delete mode 100644 benchmark/benchmark.png delete mode 100644 benchmark/benchmark_plot.py diff --git a/README.md b/README.md index 3d43b4c..53a2584 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,9 @@ BenchmarkTools.Trial: 61 samples with 7 evaluations. ## Benchmarks Here is a simple benchmark of the performance using NVIDIA A800 80GB PCIe. -We compared the performance of `CuTropicalGEMM.jl`, `GemmKernels.jl` and map reducation of `CUDA.jl` on Tropical GEMM with single precision, and used the performance of `Cublas` on normal GEMM as a reference. +We compared the performance of `CuTropicalGEMM.jl`, `GemmKernels.jl` and direct `CUDA.jl` map reduce on Tropical GEMM with single precision. + +The performance of `Cublas` on normal GEMM is used as a reference. ![benchmark FP32](benchmark/benchmark.png) @@ -85,7 +87,7 @@ We compared the performance of `CuTropicalGEMM.jl`, `GemmKernels.jl` and map red Please open an [issue](https://github.com/TensorBFS/CuTropicalGEMM.jl/issues) if you encounter any problems, or have any feature requests. -It is also welcomed for any suggestions about the issues marked as `enhancement`, please let us know if you have any idea. +It is also welcomed for any suggestions about the issues marked as `enhancement`, please let us know if you have any idea about them. ## Acknowalgement diff --git a/benchmark/benchmark.png b/benchmark/benchmark.png deleted file mode 100644 index 77a609612aa3df97f443ce5d5130d2b671e93867..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55908 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 diff --git a/benchmark/benchmark_plot.py b/benchmark/benchmark_plot.py deleted file mode 100644 index 6853e2b..0000000 --- a/benchmark/benchmark_plot.py +++ /dev/null @@ -1,43 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt - -max = 19.5 - -CublasGemm = np.array([18578.596294, 18877.954689, 18943.901496]) / 1000 -GemmKernelsTropical = np.array([10694.937413845337, 10381.497926923561, 10126.264507163212]) / 1000 -CuTropicalGEMM_FP32 = np.array([14.035, 13.486, 13.05]) -MapReduce = np.array([1.323, 0.657, 0.549]) - -total_width, n = 0.8, 4 -width = total_width / n -size = 3 -x = np.arange(size) -x = x - (total_width - width) / 2 - -plt.figure(dpi = 150) -plt.bar(x, CublasGemm, width=width, label='CublasGemm', color = 'orange') -plt.bar(x + width, CuTropicalGEMM_FP32, width=width, label='CuTropicalGEMM', color = 'g') -plt.bar(x + 2 * width, GemmKernelsTropical, width=width, label='GemmKernelsTropical', color = 'b') -plt.bar(x + 3 * width, MapReduce, width=width, label='CUDA map reduce', color = 'r') - -for a,b in zip(x, CublasGemm): - plt.text(a, b+0.5, '%.2f' % b, ha='center', va= 'bottom',fontsize=8) - -for a,b in zip(x + width, CuTropicalGEMM_FP32): - plt.text(a, b+0.5, '%.2f' % b, ha='center', va= 'bottom',fontsize=8) - -for a,b in zip(x + 2 * width, GemmKernelsTropical): - plt.text(a, b+0.5, '%.2f' % b, ha='center', va= 'bottom',fontsize=8) - -for a,b in zip(x + 3 * width, MapReduce): - plt.text(a, b+0.5, '%.2f' % b, ha='center', va= 'bottom',fontsize=8) - -plt.xticks([0.0, 1.0, 2.0], [r"$2560 \times 2048 \times 2048$", r"$5120 \times 4096 \times 4096$", r"$10240 \times 8192 \times 8192$"]) -plt.legend(ncols = 2) -plt.xlabel("Matrix size") -plt.ylabel("Performance (TFLOPS)") -plt.ylim([0.0, 25.0]) - -plt.title("A800 with FP32 performance of about 19.5 TFlops") - -plt.savefig("benchmark.png") \ No newline at end of file