Wykład 6:
Noty katalogowe

Mariusz Chilmon
m.chilmon@amw.gdynia.pl
uc.vmario.org

Noty katalogowe

Źródła not katalogowych

  • Strona producenta
    • aktualna
    • wszystkie dokumenty w jednym miejscu
    • biblioteki, kompilatory, programatory
  • ALLDATASHEET.COM
  • Google (zaskoczeni?)

Liczba stron podstawowej dokumentacji

234
ATtiny45

Liczba stron podstawowej dokumentacji

234
ATtiny45
346
ATmega32

Liczba stron podstawowej dokumentacji

234
ATtiny45
346
ATmega32
2091
OMAPL138

Liczba stron podstawowej dokumentacji

234
ATtiny45
346
ATmega32
2091
OMAPL138
24107
TDA4VM

Dokumentacja dodatkowa

  • zalecenia dla elektroników
  • sposób programowania
  • opis bootloadera
  • opis kompilatora
  • dokumentacja złożonych peryferiałów
  • rozwiązania znanych problemów

Podstawowe sekcje w nocie µC

Korzystanie z rejestrów procesora

Przypisanie wartości do rejestru

Przypisanie wartości do rejestru


		0x7A = 196; // ❌ Błąd!
	

Przypisanie wartości do rejestru


		(uint8*)0x7A = 196; // ❌ Błąd!
	

Przypisanie wartości do rejestru


		(*(uint8*))0x7A = 196; // 🤔 Nie zawsze zadziała.
	

Przypisanie wartości do rejestru


		(*(volatile uint8*))0x7A = 196; // 🧐
	

Przypisanie wartości do rejestru


		(*(volatile uint8*))0x7A = (1 << 7) | (1 << 6) | (1 << 2);
	

Przypisanie wartości do rejestru


		#define ADCSRA (*(volatile uint8*))0x7A
		ADCSRA = (1 << 7) | (1 << 6) | (1 << 2);
	

Przypisanie wartości do rejestru


		#define ADCSRA ((*(volatile uint8*))0x7A)
		#define _BV(bit) (1 << (bit))
		ADCSRA = _BV(7) | _BV(6) | _BV(2);
	

Przypisanie wartości do rejestru


		#define ADCSRA ((*(volatile uint8*))0x7A)
		#define _BV(bit) (1 << (bit))
		#define ADEN 7
		#define ADSC 6
		#define ADPS2 2
		ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADPS2);
	

Przypisanie wartości do rejestru


		#include <avr/io.h>
		ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADPS2); // 🥳
	

Ustawianie bitów


		#include <avr/io.h>
		ADCSRA = _BV(ADEN) | _BV(ADPS2);

		ADCSRA = _BV(ADSC); // Nie o to nam chodziło (╯°□°)╯︵ ┻━┻
	

Ustawianie bitów


		#include <avr/io.h>
		ADCSRA = _BV(ADEN) | _BV(ADPS2);

		ADCSRA = ADCSRA | _BV(ADSC);
	

Ustawianie bitów


		#include <avr/io.h>
		ADCSRA = _BV(ADEN) | _BV(ADPS2);

		ADCSRA |= _BV(ADSC);
	

Zerowanie bitów


		#include <avr/io.h>
		ADCSRA = _BV(ADEN) | _BV(ADPS2);

		ADCSRA = ADCSRA & ~(_BV(ADSC));
	

Zerowanie bitów


		#include <avr/io.h>
		ADCSRA = _BV(ADEN) | _BV(ADPS2);

		ADCSRA &= ~(_BV(ADSC));
	

Zwiększanie wydajności

Miary wydajności

Stałoprzecinkowe

  • MIPS (Million Instructions per Second)
    • MIPS (Meaningless Indicator of Processor Speed)
    • BogoMIPS (Bogus MIPS)
  • MOPS (Million Operations per Second)
  • TOPS (Tera Operations per Second lub Trillion Operations per Second)

Miary wydajności

Zmiennoprzecinkowe

  • FLOPS (Floating point Operations per Second)
  • MFLOPS
  • GFLOPS
  • TFLOPS

Oszukujo?

SIMD

Taksonomia Flynna

    SISD (Single Instruction, Single Data)
    zwykły komputer
    SIMD (Single Instruction, Multiple Data)
    operacje wektorowe
    MISD (Multiple Instruction, Single Data)
    redundancja w systemach krytycznych
    MIMD (Multiple Instruction, Multiple Data)
    komputery wieloprocesorowe, klastry obliczeniowe, karty graficzne, koparki kryptowalut

Technical Reference Manual

\(128\text{ op} \cdot 1\text{ GHz}\)
\(128\text{ op} \cdot 1\text{ GHz} = 128 \text{ op} \cdot 10^{9} \cdot \frac{1}{s}\)
\(128\text{ op} \cdot 1\text{ GHz} = \frac{128 \text{ op} \cdot 10^{9}}{s}\)
\(128\text{ op} \cdot 1\text{ GHz} = 128\text{ GOPS}\)
\(128\text{ op} \cdot 1\text{ GHz} = 128\text{ GOPS} \neq 256\text{ GOPS}\)
Gdzie moje GOPS-y? 😠

MAC (Multiply-accumulate)

\(128\text{ MAC} \cdot 1\text{ GHz}\)
\(128\text{ MAC} \cdot 1\text{ GHz} = 128 \cdot 2 \text{ op} \cdot 1\text{ GHz}\)
\(128\text{ MAC} \cdot 1\text{ GHz} = 256\text{ GOPS}\) ✅

TMS320C6000 DSP


		for (i = 0; i < count; i++) {
			prod = m[i] * n[i];
			sum += prod;
		}

		/*
		Loop:       ldw    .D1    *A4++,A5
		 ||         ldw    .D2    *B4++,B5
		 || [B0]    sub    .S2    B0,1,B0
		 || [B0]    b      .S1    loop
		 ||         mpy    .M1    A5,B5,A6
		 ||         mpyh   .M2    A5,B5,B6
		 ||         add    .L1    A7,A6,A7
		 ||         add    .L2    B7,B6,B7
		*/
	

Zastosowania MAC

  • FFT (Fast Fourier Transform)
  • DSP (Digital Signal Processing)
  • CNN (Convolutional Neural Network)

MMA (Matrix Multiplication Accelerator)

\(64 \cdot 64\text{ MAC} \cdot 1\text{ GHz}\)
\(64 \cdot 64\text{ MAC} \cdot 1\text{ GHz} = 4096\text{ MAC} \cdot 1\text{ GHz}\)
\(64 \cdot 64\text{ MAC} \cdot 1\text{ GHz} = 8192\text{ op} \cdot 1\text{ GHz}\)
\(64 \cdot 64\text{ MAC} \cdot 1\text{ GHz} = 8\text{ TOPS}\) ✅

Zastosowania MMA

  • CNN (Convolutional Neural Network)
  • FFT (Fast Fourier Transform)
  • DSP (Digital Signal Processing)
  • algebra liniowa

GPT

Liczba neuronów w mózgu ~ 100 miliardów

Liczba synaps (połączeń) w mózgu ~ 100 bilionów

Liczba współczynników Chat GPT 3 ~ 175 miliardów

\(\frac{175\cdot10^9 \cdot 2\text{ op}}{8\text{ TOPS}}\)
\(\frac{175\cdot10^9 \cdot 2\text{ op}}{8\text{ TOPS}} = \frac{350\cdot10^9\text{ op}}{8 \cdot10^{12}\text{ op}\cdot s^{-1}}\)
\(\frac{175\cdot10^9 \cdot 2\text{ op}}{8\text{ TOPS}} = \frac{350\cdot10^9\text{ op}}{8 \cdot10^{12}\text{ op}\cdot \text{s}^{-1}} = 0{,}04375\text{ s}\)

Ale to MMA jest stałoprzecinkowe i 8-bitowe… 🧐