Qemu SMP FPU/Altivec improvements.

About Qemu-system-ppc, a PPC Mac emulator for Windows, macOS and Linux that can run Mac OS 9.0 up to Mac OS X 10.5

Moderators: Cat_7, Ronald P. Regensburg

Post Reply
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

I figured I start a thread to monitor enhancements in Qemu SMP and see what we can do to speed up the FPU and AltiVec units over time.

Here is a link to a cross platform AltiVec benchmark we wrote so we can see how AltiVec benchmarks between Linux and Mac OS X.

https://drive.google.com/file/d/1mfqSnb ... share_link

to build on Mac OS X:

Code: Select all

gcc -O3 -faltivec -lpthread -o altivec_smp_bench altivec_smp_bench.c
To build on Linux:

Code: Select all

gcc -O3 -maltivec -malign-power2 -lpthread \
    -o altivec_smp_bench altivec_smp_bench.c
run:

Code: Select all

# defaults to 10M elements, 100 passes, N=online CPUs
./altivec_smp_bench

# or specify: elements, iterations, threads
./altivec_smp_bench 5000000 200 8
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

gcc -O3 -maltivec -lpthread -o altivec_smp_bench altivec_smp_bench.c
altivec_smp_bench.c: In function ‘thread_func’:
altivec_smp_bench.c:35:19: warning: implicit declaration of function ‘vec_ld’ [-Wimplicit-function-declaration]
35 | va = vec_ld(0, &arg->a);
| ^~~~~~
altivec_smp_bench.c:35:19: error: incompatible types when assigning to type ‘__vector float’ {aka ‘__vector(4) float’} from type ‘int’
altivec_smp_bench.c:36:19: error: incompatible types when assigning to type ‘__vector float’ {aka ‘__vector(4) float’} from type ‘int’
36 | vb = vec_ld(0, &arg->b);
| ^~~~~~
altivec_smp_bench.c:37:19: warning: implicit declaration of function ‘vec_add’ [-Wimplicit-function-declaration]
37 | vc1 = vec_add(va, vb);
| ^~~~~~~
altivec_smp_bench.c:37:13: error: AltiVec argument passed to unprototyped function
37 | vc1 = vec_add(va, vb);
| ^~~
altivec_smp_bench.c:38:19: warning: implicit declaration of function ‘vec_mul’ [-Wimplicit-function-declaration]
38 | vc2 = vec_mul(vc1, vb);
| ^~~~~~~
altivec_smp_bench.c:38:13: error: AltiVec argument passed to unprototyped function
38 | vc2 = vec_mul(vc1, vb);
| ^~~
altivec_smp_bench.c:39:19: warning: implicit declaration of function ‘vec_sub’ [-Wimplicit-function-declaration]
39 | vc3 = vec_sub(vc2, va);
| ^~~~~~~
altivec_smp_bench.c:39:13: error: AltiVec argument passed to unprototyped function
39 | vc3 = vec_sub(vc2, va);
| ^~~
altivec_smp_bench.c:40:13: warning: implicit declaration of function ‘vec_st’ [-Wimplicit-function-declaration]
40 | vec_st(vc3, 0, &arg->c);
| ^~~~~~
altivec_smp_bench.c:40:13: error: AltiVec argument passed to unprototyped function
jam@debian:~/Downloads$
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

https://drive.google.com/file/d/1mfqSnb ... share_link

Code: Select all

gcc -O3 -maltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

Code: Select all

            gcc -O3 -maltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
altivec_smp_bench.c: In function ‘thread_func’:
altivec_smp_bench.c:31:5: error: ‘vector’ undeclared (first use in this function)
   31 |     vector float va, vb, vc1, vc2, vc3;
      |     ^~~~~~
altivec_smp_bench.c:31:5: note: each undeclared identifier is reported only once for each function it appears in
altivec_smp_bench.c:31:11: error: expected ‘;’ before ‘float’
   31 |     vector float va, vb, vc1, vc2, vc3;
      |           ^~~~~~
      |           ;
altivec_smp_bench.c:35:13: error: ‘va’ undeclared (first use in this function)
   35 |             va  = vec_ld(0, &arg->a[i]);
      |             ^~
altivec_smp_bench.c:36:13: error: ‘vb’ undeclared (first use in this function)
   36 |             vb  = vec_ld(0, &arg->b[i]);
      |             ^~
altivec_smp_bench.c:37:13: error: ‘vc1’ undeclared (first use in this function)
   37 |             vc1 = vec_add(va, vb);
      |             ^~~
altivec_smp_bench.c:38:13: error: ‘vc2’ undeclared (first use in this function)
   38 |             vc2 = vec_mul(vc1, vb);
      |             ^~~
altivec_smp_bench.c:39:13: error: ‘vc3’ undeclared (first use in this function)
   39 |             vc3 = vec_sub(vc2, va);
      |             ^~~
                              
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

https://drive.google.com/file/d/1mfqSnb ... share_link

Code: Select all

# Linux PPC64 LE / BE, PPC32 BE
gcc -O3 -maltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c

# Mac OS X Tiger/Leopard PPC
gcc -O3 -faltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

Code: Select all

 cc -O3 -maltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
altivec_smp_bench.c: In function ‘main’:
altivec_smp_bench.c:96:14: error: expected ‘;’ at end of input
   96 |         targs
      |              ^
      |              ;
altivec_smp_bench.c:96:9: error: expected declaration or statement at end of input
   96 |         targs
      |         ^~~~~
altivec_smp_bench.c:96:9: error: expected declaration or statement at end of input
  
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

https://drive.google.com/file/d/1mfqSnb ... share_link

Linux

Code: Select all

gcc -O3 -maltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
Mac OS X

Code: Select all

gcc -O3 -faltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

Code: Select all

./altivec_smp_bench 10000000 100 8
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

Code: Select all

gcc -O3 -faltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
In file included from altivec_smp_bench.c:6:
/usr/lib/gcc/powerpc-apple-darwin8/4.0.1/include/altivec.h:44:2: warning: #warning Ignoring <altivec.h> because "-faltivec" specified
altivec_smp_bench.c: In function 'thread_func':
altivec_smp_bench.c:40: error: AltiVec argument passed to unprototyped function
altivec_smp_bench.c: In function 'main':
altivec_smp_bench.c:65: error: '_SC_NPROCESSORS_ONLN' undeclared (first use in this function)
altivec_smp_bench.c:65: error: (Each undeclared identifier is reported only once
altivec_smp_bench.c:65: error: for each function it appears in.)
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

https://drive.google.com/file/d/1mfqSnb ... share_link

Linux:

Code: Select all

gcc -O3 -maltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
OS X:

Code: Select all

gcc -O3 -faltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

darthnvader wrote: Sun May 11, 2025 12:13 pm https://drive.google.com/file/d/1Orbdz6 ... share_link

Linux:

Code: Select all

gcc -O3 -maltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
OS X:

Code: Select all

gcc -O3 -faltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
This version seems to work with OS X beating out LinxPPC64LE by quite a bit, about 2.5x.

I'm adding optimized code for VSX for the Power9, sadly VSX does not exist on the G4/G5, but it will give us some idea of how it works with Qemu-system-ppc64 on the pseries with -cpu power9.

https://drive.google.com/file/d/1Orbdz6 ... share_link

Linux Power9:

Code: Select all

gcc -O3 -maltivec -mvsx -mcpu=power9 -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
OS X:

Code: Select all

 gcc -O3 -faltivec -std=c89 -lpthread -o altivec_smp_bench altivec_smp_bench.c
darthnvader
Apple Corer
Posts: 231
Joined: Sun Feb 07, 2016 4:40 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by darthnvader »

Now I'm working on making it cross platform for arch ppc/aarch64/x86 using SSE2 and NEON as well as VSX/VMX.

https://drive.google.com/file/d/14vJlt8 ... share_link
gtxaspec
Tinkerer
Posts: 63
Joined: Mon Oct 19, 2015 7:32 pm

Re: Qemu SMP FPU/Altivec improvements.

Post by gtxaspec »

very cool! may want to look into having a github repo for better visibility!
Post Reply