From 54a56ee8a087201efc20f69721725e92f8c332c5 Mon Sep 17 00:00:00 2001 From: ytshih Date: Mon, 5 Oct 2026 09:13:57 +0800 Subject: [PATCH] feat: part2 and zip --- .gitignore | 2 ++ HW1_111550013.zip | Bin 0 -> 1668 bytes part1/vectorOP.cpp | 5 +++++ part2/test.sh | 9 +++++++++ part2/test1.c | 5 ++++- part2/test2.c | 5 ++--- part2/test2.c.orig | 19 +++++++++++++++++++ 7 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 HW1_111550013.zip create mode 100644 part2/test.sh create mode 100644 part2/test2.c.orig diff --git a/.gitignore b/.gitignore index c2769f1..732b31c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ myexp +test_auto_vectorize +**/*.s **/*.o **/*.swp diff --git a/HW1_111550013.zip b/HW1_111550013.zip new file mode 100644 index 0000000000000000000000000000000000000000..00ccbb33f3f8679c6c84046cc7848563bd47fe53 GIT binary patch literal 1668 zcmWIWW@Zs#U|`^2*zVyPJF9>wnz_2$wH~+Soz`u9#g~f&rt89 zT(>R<+#@qi`C_LxFci zymRch%p@|6z6mCu5Eb{{v5V<>@JElYW|NM)ecda{E!LSL6_+0|X|YsO{gjC@K8GZ4xVGL}%l7!9(wdgwWpW4p{I>LL z`*yr_)}u*HcN4zql}&u2eE%7}|1;`$RG9zP zZFzq#!RC{i-I{I3n&Kk2d$XrrP#cMl+ zrfKt(&kL=49=rRM-e1wTN~QA{V_pZ$5c$M^RPP%1#)CeI)|Mjgg;>)>^u8Dd-q|JDA^R>EDU6J6&=m{!_p6yJWwZ>3C4K zTh8aix&>Jp!G9Nif9+#g|5S3-n@OjF``1K^Exx=wyXSm&srk&A+p2qy&RP}sBK_ps z7bmtF20s1z=6w0{%QsEW=-rQl4EB&?ENR} zKTZsu(dLq|oAYDzDvAC4skSe#u;_fasC(y%XrB7goR|OieX(CK{~OQuX2%yx8BW|d z`!}~&kNx{yvs>3M9+{QBwj@e!`Zp_yIW4p9ru|FunK0|evuR~_qg;*Vo0hx?O<4Pt zkL8Zp7rwlzKW+)(Dj)41=62Qm{+dy3eD$UEgL`I+vz6ooMGw8y{1U8J7NmZ`ynB6S zVPD^$rne`a<#7BvzQB@mqD7a*%q?p+Ejp~F9hbAUEHI=eD315|Vpr+IQr;yS8wD$4 zKC&npR8PE69Lf3DbwEs^BzvEo$-lfSF!7tyM51%PlV68x8RY{ihS?+)xk}K^{BY`>x$vCv!Z)XzP6hvVa^F5ZpV#%tv&>D;+1R~$ z7?yd6bauZ8ZEn<*@O#{OaqZ%33oo8%3XMDMzQy=|zwLC6X{kBYbC=Jbzx2(9FIO)I zJw4IuS?2NU(Saa&X1*P7)^3|NOOmtd{G30_IUiieJ}X+28h;@2b(}!RkK^B7zm=3R z?@V>g54Ha7x_J9ZsWi?_yzjh!^x5s{+!ehd=>ALCLp)3$CMJ-)3N=gcft@QOX z5|guYQ}ia8;l>y-!Rt9D)J_+z +#include // implementation of absSerial(), but it is vectorized using PP intrinsics void absVector(float *values, float *output, int N) @@ -84,6 +86,9 @@ void clampedExpVector(float *values, int *exponents, float *output, int N) _pp_vload_int(y, exponents + i, maskAll); // y = exponents[i]; } + cout << "min exponents: " << *min_element(y.value, y.value+VECTOR_WIDTH) << endl; + cout << "max exponents: " << *max_element(y.value, y.value+VECTOR_WIDTH) << endl; + _pp_vset_float(result, 1.f, maskAll); maskNonZero = _pp_init_ones(); while (_pp_cntbits(maskNonZero) > 0) { diff --git a/part2/test.sh b/part2/test.sh new file mode 100644 index 0000000..46ab149 --- /dev/null +++ b/part2/test.sh @@ -0,0 +1,9 @@ +RUNS=${1:-5} +median() { sort -n | awk '{a[NR]=$1} END{print (NR%2)?a[(NR+1)/2]:(a[NR/2]+a[NR/2+1])/2}'; } +for cfg in "novec:" "vec:VECTORIZE=1" "avx2:VECTORIZE=1 AVX2=1"; do + name=${cfg%%:*}; flags=${cfg#*:} + make -s clean; make -s $flags >/dev/null 2>&1 || { echo "build $name failed"; exit 1; } + t=$(for r in $(seq $RUNS); do ./test_auto_vectorize -t 1 | grep -oE '^[0-9.]+'; done | median) + echo "$name $t"; eval "T_$name=$t" +done +awk -v n=$T_novec -v v=$T_vec -v a=$T_avx2 'BEGIN{printf "vec/novec speedup: %.2fx\navx2/vec speedup: %.2fx\navx2/novec speedup: %.2fx\n", n/v, v/a, n/a}' diff --git a/part2/test1.c b/part2/test1.c index 686f5f7..479719b 100644 --- a/part2/test1.c +++ b/part2/test1.c @@ -1,7 +1,10 @@ #include "test.h" -void test1(float *a, float *b, float *c, int N) { +void test1(float *__restrict a, float *__restrict b, float *__restrict c, int N) { __builtin_assume(N == 1024); + a = (float *)__builtin_assume_aligned(a, 32); + b = (float *)__builtin_assume_aligned(b, 32); + c = (float *)__builtin_assume_aligned(c, 32); for (int i=0; i a[j]) - c[j] = b[j]; + if (b[j] > a[j]) c[j] = b[j]; + else c[j] = a[j]; } } } diff --git a/part2/test2.c.orig b/part2/test2.c.orig new file mode 100644 index 0000000..eac500e --- /dev/null +++ b/part2/test2.c.orig @@ -0,0 +1,19 @@ +#include "test.h" + +void test2(float *__restrict a, float *__restrict b, float *__restrict c, int N) +{ + __builtin_assume(N == 1024); + a = (float *)__builtin_assume_aligned(a, 16); + b = (float *)__builtin_assume_aligned(b, 16); + + for (int i = 0; i < I; i++) + { + for (int j = 0; j < N; j++) + { + /* max() */ + c[j] = a[j]; + if (b[j] > a[j]) + c[j] = b[j]; + } + } +}