2024-01-16

vak: (Default)
Индийская компания утверждает, что их софт управления автомобилем достиг пятого уровня автономности.


Гуглоперевод:
Расширяя нашу цель по внедрению автономного вождения 5-го уровня в самой состязательно-сложно-стохастической ситуации в мире с точки зрения динамики движения и условий окружающей среды, мы представляем автономное вождение в очень густом тумане ночью, с согласованием входящего трафика на однополосной дороге, в Индии.

Встречный разъезд на однополосной дороге требует, чтобы алгоритмы планирования движения и принятия решений автономных транспортных средств могли понимать, когда и как нужно выезжать на обочину, в зависимости от того, насколько приближающееся транспортное средство готово уступить дорогу, а затем принимать соответствующие поведенческие решения. Мы впервые продемонстрировали эту возможность в области автономного вождения в нашей демонстрации в октябре 2023 года.

В этой демонстрации мы представляем автономное вождение ночью в очень густом тумане, обминая встречный транспорт на однополосной дороге. В таких сценариях свет фар приближающегося транспортного средства полностью ослепляет визуальные датчики эго-транспортного средства, такие как камеры.

В то время как надежное обнаружение препятствий в ночное время с использованием только камер, включая восприятие их формы и оценку глубины, является активной областью неконтролируемых исследований глубокого обучения в Swaayatt Robots, чтобы продемонстрировать наши возможности по работе со объединенной информацией визуальных датчиков, мы использовали LiDAR в этой демонстрации.

В течение первых 15 секунд было видно, что для того, чтобы уйти от встречного автомобиля, который не уступил места нашему автомобилю, наш автомобиль решил выехать на обочину, чтобы разминуться без полной остановки.

Опять же, это первая в своем роде демонстрация, в которой автономное транспортное средство движется по однополосной дороге с двусторонним движением ночью сквозь туман.
vak: (Default)
Полезная утилитка показывает фичи процессора: github.com/pytorch/cpuinfo

Глянем последний эпловский процессор Apple M2 Max. Заметьте, восемь ядер одного типа и четыре ядра другого типа. Неожиданно присутствует аппаратная поддержка BFloat16. Интересно, как её задействовать в коде на Си.  
$ cpu-info

Packages:
0:
Microarchitectures:
8x Avalanche
4x Blizzard
Cores:
0: 1 processor (0), Apple Avalanche
1: 1 processor (1), Apple Avalanche
2: 1 processor (2), Apple Avalanche
3: 1 processor (3), Apple Avalanche
4: 1 processor (4), Apple Avalanche
5: 1 processor (5), Apple Avalanche
6: 1 processor (6), Apple Avalanche
7: 1 processor (7), Apple Avalanche
8: 1 processor (8), Apple Blizzard
9: 1 processor (9), Apple Blizzard
10: 1 processor (10), Apple Blizzard
11: 1 processor (11), Apple Blizzard
Logical processors:
0
1
2
3
4
5
6
7
8
9
10
11

$ isa-info

Instruction sets:
ARM v8.1 atomics: yes
ARM v8.1 SQRDMLxH: yes
ARM v8.2 FP16 arithmetics: yes
ARM v8.2 FHM: yes
ARM v8.2 BF16: yes
ARM v8.2 Int8 dot product: yes
ARM v8.2 Int8 matrix multiplication: yes
ARM v8.3 JS conversion: yes
ARM v8.3 complex: yes
SIMD extensions:
ARM SVE: no
ARM SVE 2: no
Cryptography extensions:
AES: yes
SHA1: yes
SHA2: yes
PMULL: yes
CRC32: yes

$ cache-info

Max cache size (upper bound): 4194304 bytes
L1 instruction cache: 12 x 128 KB, 4-way set associative (256 sets), 128 byte lines, shared by 1 processors
L1 data cache: 12 x 64 KB, 4-way set associative (128 sets), 128 byte lines, shared by 1 processors
L2 data cache: 4 MB (exclusive), 8-way set associative (4096 sets), 128 byte lines, shared by 12 processors
vak: (Default)
Оказывается, процессор Apple M2 поддерживает в хардвере тип данных BFloat16. Подробности есть в статье: "BFloat16 processing for Neural Networks on Armv8-A".

Проверить факт наличия BFloat16 на конкретном маке можно командой:
$ sysctl hw.optional.arm.FEAT_BF16
hw.optional.arm.FEAT_BF16: 1
К примеру, команда BFCVT превращает число float32 в bfloat16: BFCVT--Floating-point-convert-from-single-precision-to-BFloat16-format.

Алгоритм преобразования:
// FPConvertBF()
// =============
// Converts a single-precision OP to BFloat16 value with using rounding mode of
// Round to Nearest Even when executed from AArch64 state and
// FPCR.AH == '1', otherwise rounding is controlled by FPCR/FPSCR.

bits(16) FPConvertBF(bits(32) op, FPCRType fpcr, FPRounding rounding)

    bits(32) result;                                // BF16 value in top 16 bits
    boolean altfp = HaveAltFP() && !UsingAArch32() && fpcr.AH == '1';
    boolean fpexc = !altfp;                         // Generate no floating-point exceptions
    if altfp then fpcr.<FIZ,FZ> = '11';             // Flush denormal input and output to zero
    if altfp then rounding = FPRounding_TIEEVEN;    // Use RNE rounding mode

    // Unpack floating-point operand, with always flush-to-zero if fpcr.AH == '1'.
    (fptype,sign,value) = FPUnpack(op, fpcr, fpexc);

    if fptype == FPType_SNaN || fptype == FPType_QNaN then
        if fpcr.DN == '1' then
            result = FPDefaultNaN(fpcr);
        else
            result = FPConvertNaN(op);
        if fptype == FPType_SNaN then
            if fpexc then FPProcessException(FPExc_InvalidOp, fpcr);
    elsif fptype == FPType_Infinity then
        result = FPInfinity(sign);
    elsif fptype == FPType_Zero then
        result = FPZero(sign);
    else
        result = FPRoundCVBF(value, fpcr, rounding, fpexc);

    // Returns correctly rounded BF16 value from top 16 bits
    return result<31:16>;

// FPConvertBF()
// =============
// Converts a single-precision operand to BFloat16 value.

bits(16) FPConvertBF(bits(32) op, FPCRType fpcr)
    return FPConvertBF(op, fpcr, FPRoundingMode(fpcr));
В компиляторе Си имеются соответствующие встроенные тип и функции. Вот пример.
#include <stdio.h>
int main()
{
    float f = 123.456;
    __bf16 b;

    b = __builtin_aarch64_bfcvtbf(f);
    printf("From float32 to bfloat16: %.3f -> %#04hx\n", f, b);

    f = __builtin_aarch64_bfcvtsf(b);
    printf("From bfloat16 to float32: %#04hx -> %.3f\n", b, f);
}
Компилируем, запускаем:
$ gcc-13 -O -march=armv8.6-a+bf16 bfdemo.c -o bfdemo
$ ./bfdemo
From float32 to bfloat16: 123.456 -> 0x42f7
From bfloat16 to float32: 0x42f7 -> 123.500