Jestem nowy w informatyce i zastanawiałem się, czy pół precyzja jest obsługiwana przez nowoczesną architekturę w taki sam sposób, jak pojedyncza czy podwójna precyzja. Myślałem, że wersja 2008 standardu IEEE-754 wprowadziła zarówno poczwórną, jak i połowiczną precyzję.

Komentarze

  • To zostało oznaczone jako MATLAB, ale MATLAB nie ' t (jeszcze) obsługuje 16 bitów zmiennoprzecinkowe.
  • Zobacz to pytanie dotyczące wymiany stosów, które zawiera szczegółowe informacje na ten temat: stackoverflow.com/questions/49995594/…
  • Warto byłoby wyjaśnić, czy masz na myśli tylko procesory, czy oba procesory i procesory graficzne.
  • Dziękuję za komentarz Max Barraclough. Nie wiedziałem, że można zmienić precyzję tylko w procesorach graficznych (GPU); Myślałem, że trzeba to zrobić w obu. Twój komentarz jest bardzo pomocny.

Odpowiedź

Obsługa firmy Intel dla IEEE float16 format przechowywania

Intel obsługuje połowę IEEE jako typ pamięci w procesorach od czasu Ivy Bridge (2013). Typ pamięci oznacza, że można uzyskać przewagę pamięci / pojemności pamięci podręcznej / przepustowości, ale obliczenia są wykonywane z pojedynczą precyzją po konwersji na format półprecyzyjny IEEE iz powrotem.

Obsługa BFloat16 przez firmę Intel

Firma Intel ogłosiła obsługę BF16 w Cooper Jezioro i Sapphire Rapids.

Pracuję dla firmy Intel. Cytuję oficjalne źródła i nie będę komentować plotek itp.

Dobrze jest być ciekawym względną zaletą IEEE FP16 w porównaniu z BF16. Analiz tego tematu jest dużo, np. https://nhigham.com/2018/12/03/half-precision-arithmetic-fp16-versus-bfloat16/ .

Obsługa sprzętu innego niż Intel

Następujące to informacje o innych procesorach. W razie potrzeby zweryfikuj u dostawców.

http://on-demand.gputechconf.com/gtc/2017/presentation/s7676-piotr-luszcek-half-precision-bencharking-for-hpc.pdf zawiera listę wsparcia dla następującego sprzętu:

  • AMD – MI5, MI8, MI25
  • ARM – NEON VFP FP16 w V8.2-A
  • NVIDIA – Pascal i Volta

NVIDIA Ampere obsługuje również FP16 ( https://devblogs.nvidia.com/nvidia-ampere-architecture-in-depth/ ).

Komentarze

  • Pierwsza część tej odpowiedzi jest nieco myląca. Chociaż Ivy Bridge rzeczywiście wprowadził obsługę F16C, a to technicznie oznacza, że zmiennoprzecinkowe półprecyzyjne są ” obsługiwane „, jedyne instrukcje pod warunkiem, że są konwertowane na zmiennoprzecinkowe półprecyzyjne iz powrotem. Nie można na nich wykonywać żadnych operacji, więc prawie nie spełnia wymagania w pytaniu: ” Zastanawiałem się, czy połowa precyzji jest obsługiwana przez nowoczesną architekturę w taki sam sposób, jak pojedyncza lub podwójna precyzja to. ” Jest to tylko format przechowywania. ' wymieniasz cykle konwersji ALU na przepustowość / zajmowaną powierzchnię pamięci.
  • Dosłownie powiedziałem, że to typ pamięci, wszystkie oszczędności pochodzą z węższych danych, a obliczenia są wykonane z pojedynczą precyzją. W najmniejszym stopniu nie wprowadza w błąd. Powiedziałem, jakie wsparcie było obecne, czyli połowę możliwego wsparcia.
  • Dziękuję wszystkim. Właściwie każdy z tych komentarzy okazał się pomocny. Początkowym powodem zadawania tego pytania było słuchanie, jak inni kłócą się o to dokładnie.
  • @AsadMehasi: także związane z przepełnieniem stosu: Półprecyzyjne arytmetyka zmiennoprzecinkowa na układach Intela – tak na zintegrowanych procesorach graficznych od czasu Skylake, ale w rdzeniach IA tylko do konwersji do / z float podczas przechowywania / ładowania. (Do obsługi BFloat w nadchodzącym HW)

Odpowiedź

Moim zdaniem niezbyt jednolita. Wydaje się, że arytmetyka o niskiej precyzji zyskała pewną przyczepność w uczeniu maszynowym, ale istnieją różne definicje tego, co ludzie rozumieją przez niską precyzję. Istnieje połowa IEEE-754 (10-bitowa mantysa, 5-bitowy wykładnik, 1-bitowy znak), ale także bfloat16 (7-bitowa mantysa, 8-bitowy wykładnik, 1-bitowy znak), który przedkłada zakres dynamiczny nad precyzję i wiele innych formatów (19-bitowy TensorFloat firmy NVidia, fp24 AMD, może więcej?). Większość tych rzeczy działa na sprzęcie specjalnego przeznaczenia typu GPGPU.

W przeciwieństwie do tego, zmiennoprzecinkowe i podwójne mają ogólnie uzgodnione znaczenie, zgodnie z IEEE-754, reprezentacje 32-bitowe (23/8/1) i 64-bitowe (52/11/1).

Komentarze

  • Choć zdecydowanie niestandardowe, obliczenia optyczne efektywnie wykorzystują połowę -precision (lub mniej) operacji zmiennoprzecinkowych.

Odpowiedź

Zaakceptowana odpowiedź stanowi przegląd. Dodam jeszcze kilka szczegółów na temat obsługi procesorów NVIDIA. Wsparcie, które tu opisuję, to 16-bitowa, zgodna z IEEE 754, obsługa arytmetyki zmiennoprzecinkowej, w tym dodawanie, mnożenie, mnożenie-dodawanie i konwersje do / z innych formatów .

Maxwell (około 2015 r.)

Najwcześniej IEEE 754 Obsługa FP16 („binary16” lub „Half Precision”) pojawiła się w cc (możliwości obliczeniowe) 5.3, które były w generacji Maxwell, ale ta funkcja obliczeniowa została zaimplementowana tylko w procesor Tegra TX1 (SoC, np. Jetson).

Pascal (około 2016 r.)

Pascal członkowie rodziny mają „pełną stawkę” (cc 6,0, 6,2 ) lub „niska prędkość” (cc 6,1) FP16. cc6.2 był ponownie produktem rodziny Tegra, TX2. cc 6.0 i 6.1 znalazły zastosowanie w różnych procesorach w różnych rodzinach produktów, takich jak GeForce, Quadro i Tesla. „Pełna szybkość” odnosi się tutaj do szybkości, która jest równoważna dwukrotności szybkości IEEE 754 FP32 („binary32” lub „pojedyncza precyzja”) dla danego procesora, gdy operacje były wykonywane przy użyciu typu danych o połowę2 (dwie połówki przetwarzane w ten sam rejestr i instrukcja).

Volta, Turing (2017, 2018)

Volta i Turing członkowie rodziny (cc 7.x) wspierają FP16 w ” full rate ”, a ponadto użyj formatu w operacjach TensorCore .

Amper (maj 2020 r.)

Niedawno ogłoszony procesor graficzny A100 o amperowej architekturze obsługuje również układy GPU FP16 w sposób podobny do Volty i Turinga i wprowadza dodatkowe możliwości dla typu danych TF32 , który jest formatem, w którym mantysa ma ten sam rozmiar (liczbę bitów) jako mantysa FP16 i t Wykładnik jest tego samego rozmiaru co wykładnik FP32. Funkcja Bfloat16 została również ogłoszona w Ampere.

Oprócz niedawno ogłoszonego procesora architektury Ampere, obsługa i przepustowość 16-bitowych operacji zmiennoprzecinkowych (i inne operacje) w zakresie możliwości obliczeniowych (w tym architektur) można znaleźć w tabeli 3 przewodnika programowania CUDA . Przepustowości są na zegar, na wieloprocesor, więc muszą być odpowiednio skalowane dla typu GPU i specyfikacji. Te przepustowości nie dotyczą operacji TensorCore, a przepustowości szczytowe są generalnie stosowane tylko przy przetwarzaniu na połówkowych typach danych (dwie połówki ilości spakowane razem w jednym 32-bitowym słowie).

Odpowiedź

Możesz sprawdzić, czy twój sprzęt obsługuje połowiczną precyzję, poprzez:

$ lscpu | grep Flags | grep f16c Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req md_clear flush_l1d 

jest udokumentowana tutaj .

Komentarze

  • Zauważ, że C w F16C oznacza konwersję; pomaga tylko w przypadku przepustowości pamięci / rozmiaru pamięci podręcznej, a nie przepustowości SIMD ALU. Aby wykonać obliczenia matematyczne, musisz przekonwertować je na zmiennoprzecinkowe, więc liczba elementów na wektor SIMD dla operacji FMA nie jest ' nie poprawiona.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *