2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3
 
 Re: Работа с ИК матрицей MLX90640
Сообщение10.04.2024, 20:52 

(Оффтоп)

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

 
 
 
 Re: Работа с ИК матрицей MLX90640
Сообщение20.07.2024, 10:26 
Прикольный девайс - брал как стойка под гравер/дрель для сверления отверстий в печатных платах, а у него оказывается, ещё и голова поворотная со шкальником до 90 град.
Для плат вряд ли пригодится, но для других поделок лишним не будет..
Изображение

 
 
 
 Re: Работа с ИК матрицей MLX90640
Сообщение02.05.2025, 23:08 
Почти год назад один добрый человек выложил свои труды по созданию драйвера для сопроцессора NPU для чипа RK3588 (это тот, который по заявлениям 6 TOPs производительности выдает и предполагается к использованию для нейровычислений). Однако в firmware, по-крайней мере на плату orange pi 5, которая есть у меня, от китайцев драйверов в явном виде на него нет. Посему приходится пользоваться их специализированными тулчейнами для нейро- пакетов, и любой шаг в сторону - например, использовать нейрочип по своему усмотрению, скажем, для решения каких-то затратных вычислений (не нейро-) для разгрузки основного процессора, не получится.
А Томеу Визосо сделал заплатки для исходников ядра, содержащие основные методы работы с нейрочипом на пользовательском уровне, причем на 3 ядра можно повесить разные задачи, что также приближает к вычислениям в реальном времени.
Начал пробовать - пока отработал (вернее вспомнил и возобновил, так как пару лет назад уже собирал для оранджа) сборку ядра, загрузчика и файловой системы и скачал патчи...
https://www.linux.org.ru/news/opensource/17649931

 
 
 
 Re: Работа с ИК матрицей MLX90640
Сообщение12.05.2025, 20:05 
В общем, с нейрочипом не всё так просто. Драйвера-то есть, но совсем не документированы. Очень тяжко и долго идет работа - почти как реверс-инжиниринг. :-)
Надо посмотреть в сторону GPU, которое GPGPU в случае с орандж (так как в моих проектах графической оболочки нет, то можно использовать "графику" под свои задачи). Тут использован ускоритель mali g610 с 64 ядрами на 1 ГГц, который поддерживает opencl (2.1 по-моему)..
Лет 10 назад сравнивал cuda vs opencl для какой-то нвидиа карты (не своим естественно кодом, а чем-то там тестовым для майнинга). Помню, что для тех версий было примерно одинаково по производительности.
OpenCL хотя бы документирована неплохо.. :-) Главное правильно задачу распараллелить на всякие там кластеры, айтемы и проч..

 
 
 
 Re: Работа с ИК матрицей MLX90640
Сообщение08.06.2025, 14:49 
После определенных танцев с бубнами (а разве бывает без них с линуксом? :-) ) удалось затащить нужные пакеты и зависимости opencl для граф. ускорителя рокчипа mali g610.
Нашел на гитхабе и несколько модифицировал пример вычислений - добавил измерение времени расчета.
И тут поджидал первый сюрприз - размеры двух интовых векторов, которые передаются в кернел для вычислений менял в широких пределах (от 512 до $512 \cdot 512$):

(Оффтоп)

Код:
#include <stdio.h>
#include <stdlib.h>
#include <chrono>
#include <CL/cl.h>
#define MAX_SOURCE_SIZE (0x100000)
using namespace std;
using namespace std::chrono;

int main(void) {
    printf("started running\n");
    int i;
    const int LIST_SIZE = 512 * 512; //<- размерность тех самых векторов
    int *A = (int*)malloc(sizeof(int)*LIST_SIZE);
    int *B = (int*)malloc(sizeof(int)*LIST_SIZE);
    for(i = 0; i < LIST_SIZE; i++) {
        A[i] = i;
        B[i] = LIST_SIZE - i;
    }
...

Далее, после компиляции кернела opencl (которая у него происходит, как известно, во время исполнения) и загрузки векторов А и В, производится собственно вычисление и замер времени на оное:

(Оффтоп)

Код:
...
    auto start_time = high_resolution_clock::now();
    // запуск кернела opencl
    size_t global_item_size = LIST_SIZE;
    size_t local_item_size = 64; // тут я думал, что указывается макс. возможное кол-во однотипных процессов (для уск-ля g610 это и есть 64)
   //запускаем очередь на выполнение:
    ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL,
            &global_item_size, &local_item_size, 0, NULL, NULL);
    auto stop_time = high_resolution_clock::now();
...

Немного пояснил в комментариях к коду, но хотел сказать, что ожидал, что время на выполнение будет прямо пропорционально зависеть от соотношения длины векторов к количеству ядер (айтемов) ускорителя:
$T = K \cdot ( LIST_SIZE / local_item_size )$
Вычисления в примере сделал не сложными. Вот код кернела:

(Оффтоп)

Код:
__kernel void vector_add(__global const int *A, __global const int *B, __global int *C) {

    int i = get_global_id(0);
    C[i] = A[i]*2 + B[i]*3 + A[i]*4 + B[i]*5;
}


Однако, что удивительно, время вычислений абсолютно не зависит от длины векторов (по крайней мере, в диапазоне от 512 до $512 \cdot 512$) и составляет 40-45 мс! :shock:
Это вобщем-то хорошо, не хорошо то, что я тогда не понимаю, что от чего зависит... :cry:

 
 
 [ Сообщений: 35 ]  На страницу Пред.  1, 2, 3


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group