Permalänk

FP 16 i ARM (Raspberry Pi 4)

ARM har tillgång till FP16 förutom FP32 och FP64. För AArch32 finns det två format:
-mfp16-format=ieee och -mfp16-format=alternative
Typen -Float16 definieras dock i ISO
Jag har testad denna kod (man matar in två heltal vid körning).

#include <stdio.h> #include <stdlib.h> #include <arm_fp16.h> int main(int argc, char *argv[]) { int a, b; float f1; double f2; _Float16 f3, f4; if (argc < 3) exit(1); b = atoi(argv[--argc]); if (b == 0) exit(2); a = atoi(argv[--argc]); f1 = (float) a/b; f2 = (double) a/b; f3 = (_Float16) a/b; printf("a+b = %d\n", a+b); printf("a-b = %d\n", a-b); printf("a*b = %d\n", a*b); printf("a/b = %d\n", a/b); /* truncates towards 0 (in C99) */ printf("a%%b = %d\n", a%b); /* same sign as first operand (in C99) */ printf("f1 = %5.15f\n", f1); printf("f2 = %5.15f\n", f2); printf("f3 = %5.15f\n", f3); return 0; }

Den kan kompileras med:
gcc -mfpu=vfpv4 -mfpu16-format=ieee arithm.c
för Raspberry Pi 4.
Något fel är det dock på -Float16 som syns vid printf
Någon med mer erfarenhet av FP16?

Permalänk

Detta fungerar bättre:

#include <stdio.h> #include <stdlib.h> #include <arm_fp16.h> int main(int argc, char *argv[]) { int a, b; float f1; double f2; __fp16 f3, f4; if (argc < 3) exit(1); b = atoi(argv[--argc]); if (b == 0) exit(2); a = atoi(argv[--argc]); f1 = (float) a/b; f2 = (double) a/b; f3 = (__fp16) a/b; printf("a+b = %d\n", a+b); printf("a-b = %d\n", a-b); printf("a*b = %d\n", a*b); printf("a/b = %d\n", a/b); /* truncates towards 0 (in C99) */ printf("a%%b = %d\n", a%b); /* same sign as first operand (in C99) */ printf("f1 = %5.15f\n", f1); printf("f2 = %5.15f\n", f2); printf("f3 = %5.15f\n", f3); return 0; }

Än ser jag dock ingen skillnad på =ieee och =alternative
Den sista ska klara ett max på 131008 men jag får inf precis som med ieee.

Permalänk
Medlem

Kör du 64bit Linux. De flesta kör med 32 även på rpi4.
Det bästa 64 systemet är gentoo. https://wiki.gentoo.org/wiki/User:NeddySeagoon/Raspberry_Pi4_...

Skickades från m.sweclockers.com

Permalänk

32-bitar

Skrivet av Irre:

Kör du 64bit Linux. De flesta kör med 32 även på rpi4.
Det bästa 64 systemet är gentoo. https://wiki.gentoo.org/wiki/User:NeddySeagoon/Raspberry_Pi4_...

Skickades från m.sweclockers.com

Jag kör 32bitar dvs samma som går på alla Raspberry Pi.
Nu har jag provat FP16 på matris-multiplikation.
Obetydlig skillnad vid 1000x1000 men ca 3½ snabbare än double vid 2000x2000.

Permalänk
Medlem
Skrivet av Greyguy1948:

Jag kör 32bitar dvs samma som går på alla Raspberry Pi.
Nu har jag provat FP16 på matris-multiplikation.
Obetydlig skillnad vid 1000x1000 men ca 3½ snabbare än double vid 2000x2000.

Varför kör du inte 64bit https://www.raspberrypi.org/forums/viewtopic.php?p=1491136
Jag har testat på rpi3 och det funkar utmärkt. Speciellt om man inte är beroende av snabb grafik.

Permalänk
Skrivet av Irre:

Varför kör du inte 64bit https://www.raspberrypi.org/forums/viewtopic.php?p=1491136
Jag har testat på rpi3 och det funkar utmärkt. Speciellt om man inte är beroende av snabb grafik.

Motivera gärna varför!
Den bästa programvaran är oftast bäst avlusad.
Så för Pi är det nog STD-programmen (32bitar).
32bitar räcker till allt mitt RAM=2GB.

Just för min test har jag inga alternativ på ARM 64-bitar.....

Permalänk
Skrivet av Greyguy1948:

Detta fungerar bättre:

#include <stdio.h> #include <stdlib.h> #include <arm_fp16.h> int main(int argc, char *argv[]) { int a, b; float f1; double f2; __fp16 f3, f4; if (argc < 3) exit(1); b = atoi(argv[--argc]); if (b == 0) exit(2); a = atoi(argv[--argc]); f1 = (float) a/b; f2 = (double) a/b; f3 = (__fp16) a/b; printf("a+b = %d\n", a+b); printf("a-b = %d\n", a-b); printf("a*b = %d\n", a*b); printf("a/b = %d\n", a/b); /* truncates towards 0 (in C99) */ printf("a%%b = %d\n", a%b); /* same sign as first operand (in C99) */ printf("f1 = %5.15f\n", f1); printf("f2 = %5.15f\n", f2); printf("f3 = %5.15f\n", f3); return 0; }

Än ser jag dock ingen skillnad på =ieee och =alternative
Den sista ska klara ett max på 131008 men jag får inf precis som med ieee.

Nu ser jag effekten av -mfp16-format=alternative
gcc -mfpu=neon-vfpv3 -mfp16-format=alternative filnamn.c
Nu försvinner inf för stora tal men få siffror är rätt!