From ef721b13e06881bb0da9770ea894af0db892a391 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 13 Apr 2025 14:20:16 +0200 Subject: [PATCH] evaluation: updated notes for chapter --- thesis/chapters/evaluation.tex | 2 ++ thesis/main.pdf | Bin 720592 -> 720694 bytes 2 files changed, 2 insertions(+) diff --git a/thesis/chapters/evaluation.tex b/thesis/chapters/evaluation.tex index a9e4dfb..e7703fd 100644 --- a/thesis/chapters/evaluation.tex +++ b/thesis/chapters/evaluation.tex @@ -23,6 +23,7 @@ Initial: CPU-Side single-threaded; up to 1024 threads per block; bounds-checking 2.) Using @inbounds -> noticeable improvement in 2 out of 3 3.) Tuned blocksize with NSight compute -> slight improvement 4.) used int32 everywhere to reduce register usage -> significant performance drop (probably because a lot more waiting time "latency hiding not working basically", or more type conversions happening on GPU? look at generated PTX code and use that as an argument to describe why it is slower) +5.) reverted previous; used fastmath instead -> imporvement (large var set is now faster than on transpiler) \subsection{Transpiler} Results only for Transpiler (also contains final kernel configuration and probably quick overview/recap of the implementation used and described in Implementation section @@ -35,6 +36,7 @@ Initial: CPU-Side single-threaded; up to 1024 threads per block; bounds-checking 2.) Using @inbounds -> small improvement only on CPU side code 3.) Tuned blocksize with NSight compute -> slight improvement 4.) Only changed things on interpreter side +5.) Only changed things on interpreter side \subsection{Comparison} Comparison of Interpreter and Transpiler as well as Comparing the two with CPU interpreter diff --git a/thesis/main.pdf b/thesis/main.pdf index 6bf157e619e6c41bac89b85ec723ac64c7b4dc9d..72208b9c8f874b7581d052ffcee71be6276478e5 100644 GIT binary patch delta 6942 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 KxYP{Pf&UM37yZZp