LINUX.ORG.RU

Сообщения Reset

 

Статус поддержки Apple GPU в AdaptiveCPP

 , ,

В прошлый раз я писал когда поддержку смержили в мастер: В AdaptiveCpp смержили Metal backend для Apple GPU

С тех пор много изменилось. Сегодня был заапрувлен финальный PR (https://github.com/AdaptiveCpp/AdaptiveCpp/pull/2072), добавляющий более менее полную поддержку USM (unified shared memory). Теперь можно работать с косвенными структурами данных (списки, деревья) и даже запускать студ мапу внутри Apple GPU в подобном коде:


  using usm_map = std::map<int, int, std::less<int>,
                           usm_allocator<std::pair<const int, int>>>;

  usm_map* m = static_cast<usm_map*>(sycl::malloc_shared(sizeof(usm_map), q));
  new (m) usm_map(usm_allocator<std::pair<const int, int>>(q));

  for (int i = 0; i < N; ++i)
      m->insert({i * 2, i * 2 * 10});

  q.submit([&](sycl::handler& h) {
      h.parallel_for(sycl::range<1>(N), [=](sycl::id<1> idx) {
          auto it = m->find(keys[idx]);
          if (it != m->end())
              results[idx] = it->second;
      });
  }).wait();

  for (int i = 0; i < N; ++i)
      assert(i % 2 == 0 ? results[i] == i * 10 : results[i] == -1);

Как это работает. Сначала выделяем терабайт виртуальных адресов с помощью mmap, а потом используем вариант вызова newBuffer, который первым аргументом принимает cpu адрес. В этом случае мы можем контролировать отображение cpu адреса на gpu адрес и даже сделать так что адреса будут отличаться на константу (зависящую от конкретного запуска программы).

Алгоритм достаточно простой, можно посмотреть в metal_allocator.cpp.

Далее делаются LLVM пасы, которые заменяют каждый релевантный load адреса на +delta и каждый store адреса на -delta. Используется соглашение что в буферах всегда лежат cpu адреса. Сама delta просто проталкивается в ядро в рантайме.

Работает все замечательно. Я добавил десяток тестов с древовидными структурами данных. Один из них кстати выявил деградацию на AMD

Reset
()

Добавил поддержку корутин в свою реализацию Кумира

 ,

Предыдущая серия про Кумир тут: Компилятор русского языка программирования Кумир

Если кратко то я добавил поддержку корутин. На синтаксисе это никак не отразилось, а вот во внутреннем языке оно есть. Это позволило в частности сделать нормальную анимацию в браузере.

Например, есть код анимации задачи n-тел:

использовать Рисователь

  алг
  нач
      вещ таб x[0:N-1], y[0:N-1], vx[0:N-1], vy[0:N-1]
      вещ таб tx[0:N-1, 0:TAIL-1], ty[0:N-1, 0:TAIL-1]
      цел frame

      инициализировать(x, y, vx, vy, tx, ty)
      новый лист(W, H, чёрный)

      frame := 0
      нц пока да
          шаг_физики(x, y, vx, vy, tx, ty)
          нарисовать(frame, x, y, tx, ty)
          frame := frame + 1
      кц
  кон

  алг шаг_физики(...)
  нач
      | обычный CPU-код, без команд Рисователя
  кон

  алг нарисовать(...)
  нач
      | рисуем кадр
      окружность(int(CX), int(CY), 12)
      ...
      окружность(int(x[i]), int(y[i]), 2)

      | граница кадра / suspend point
      новый лист(W, H, чёрный)
  кон

Трансляция во внутренний язык (ast, core-lang):

(fun <main> void () ()
    (block
      ...
      (call инициализировать x y vx vy tx ty)
      (call |новый лист| W H чёрный)
      (= frame 0)
      (while
        #t
        (block
          (call шаг_физики x y vx vy tx ty)
          (call нарисовать frame x y tx ty)
          (= frame (+ frame 1))))))

  (fun шаг_физики void (...) ()
    (block
      ...))

  (fun нарисовать void (...) ()
    (block
      ...
      (call окружность (call int CX) (call int CY) 12)
      ...
      (call окружность (call int (index i x)) (call int (index i y)) 2)
      (call |новый лист| W H чёрный)))

Тут «новый лист» это на самом деле переход к новому фрейму. Это корутина. Данный ast трансформируется в

(fun <main> <future void> () ()
    (block
      ...
      (call инициализировать x y vx vy tx ty)

      ;; прямой suspend point: painter_new_sheet / "новый лист"
      (await (call |новый лист| W H (: 4278190080 <named цвет i64>)))

      (= frame 0)
      (while
        (cast 1 bool)
        (block
          ;; обычная функция: не стала корутиной
          (call шаг_физики x y vx vy tx ty)

          ;; транзитивный await:
          ;; main ждёт нарисовать, потому что нарисовать внутри вызывает новый лист
          (await (call нарисовать frame x y tx ty))

          (= frame (+ frame 1))))))

  (fun шаг_физики void (...) ()
    (block
      ...))

  (fun нарисовать <future void> (...) ()
    (block
      ...
      (call окружность (call int CX) (call int CY) 12)
      ...
      (call окружность (call int (index i x)) (call int (index i y)) 2)

      ;; локальный suspend point, из-за него вся функция стала Future<void>
      (await (call |новый лист| W H (: 4278190080 <named цвет i64>)))))

То есть автоматом ставится await и все вызывающие функции транзитивно становятся корутинами. Это позволяет прыгнуть в js, сделать отрисовку, а потом прыгнуть назад в кумир.

Демка: http://qumir.dev/s/ZTZjYjM2NzRk

Звезды ставить сюда: https://github.com/resetius/qumir

Reset
()

Приехал M5 Pro

 

Ради интереса собрал deal.II - оно просто пролетело сборку. Тяжёлый templated HPC-код, а ощущение как будто hello world собрал

В очередной раз убеждаюсь: Apple - боги

Дальше планирую гонять бенчи по эмуляции физики на GPU

Reset
()

В AdaptiveCpp смержили Metal backend для Apple GPU

 , , ,

В AdaptiveCpp добавили поддержку Metal backend: теперь SYCL-код можно исполнять на GPU Apple через Metal (пайплайн LLVM IR -> MSL + рантайм). Это позволяет запускать вычислительные ядра на macOS на встроенной графике Apple

Пример минимального SYCL-кода (векторное сложение на устройстве):

#include <sycl/sycl.hpp>

int main() {
  constexpr size_t N = 256;
  sycl::queue q;

  int *a = sycl::malloc_shared<int>(N, q);
  int *b = sycl::malloc_shared<int>(N, q);
  int *c = sycl::malloc_shared<int>(N, q);

  for(size_t i=0;i<N;i++){ a[i]=i; b[i]=2*i; }

  q.parallel_for(sycl::range<1>(N), [=](sycl::id<1> i) {
    c[i] = a[i] + b[i];
  }).wait();

  sycl::free(a, q); sycl::free(b, q); sycl::free(c, q);
}

Проект AdaptiveCpp: https://github.com/AdaptiveCpp/AdaptiveCpp

Коммит

Перемещено hobbit из opensource

Reset
()

Компилятор русского языка программирования Кумир

 

Я написал компилятор языка Кумир. Можно запускать программы как в интерпретаторе, так и компилировать в исполняемый файл или webasm. Есть онлайн-версия

Пробовать можно тут: https://qumir.dev/

Ссылка на гитхаб: https://github.com/resetius/qumir

Онлайн сервис написан на C++: https://github.com/resetius/qumir/blob/master/service/server.cpp

Для http используется мой собственный фреймворк: https://github.com/resetius/coroio

Reset
()

AI создал Quake 2

 ,

Reset
()

C++-гуру после 22 лет работы уволился из Microsoft и ушел в хедж-фонд

 

Герб Саттер, автор культовых книг по C++ и человек, который буквально сформировал современные стандарты языка, решил сменить корпоративные кабинеты Microsoft на мир больших денег.

https://herbsutter.com/2024/11/11/a-new-chapter-and-a-pivotal-year-for-cpp/

Reset
()

Квест длинной в 8 месяцев пройден

 ,

С сегодняшнего дня я официально стал обладателем статуса UK Global Talent. Принимаю поздравления в этой теме!

Reset
()

Опубликовал статью на Хабр про переход с MapReduce на стриминговый движок для SQL

 

Опубликовал статью на Хабре, где рассказываю о том, как мы перешли от системы MapReduce к новому стриминговому движку. Это значительно ускорило обработку данных. Исходники движка доступны на гитхабе.

Вот статья: https://habr.com/ru/companies/yandex/articles/808059/

Reset
()

Фейковый российский монитор

 

Обсуждали уже новость про фейковый российский монитор в котором российский чип занимался всего лишь подачей питания на скрытый чип от realtek?

Производитель мониторов подал в суд на техноблогера из-за разоблачающего видео

Reset
()

AMD тайно внедряла уязвимости в процессоры Intel

 , ,

Reset
()

Долгожданная статья ученика Столярова о том, что rust-говно

 

Reset
()

В очередь за салфеткой от Apple выстроились?

 

https://www.apple.com/ru/shop/product/MM6F3ZM/A/салфетка-для-дисплея

Предзаказ - 5 недель. Надо торопиться, чем позже заказать тем дольше ждать придется. Говорят, чтобы купить эту салфетку, в Китае китайцы с палатками живут у магазинов apple.

Reset
()

Противостояние SCO и IBM окончено. IBM выплатит SCO компенсацию в размере $14M долларов.

 , ,

«IBM и SCO спустя 18 лет тяжб пошли на мировую. «Голубой гигант» выплатит компенсацию – чуть больше $14 млн.»

https://www.cnews.ru/news/top/2021-08-30_polozhen_konets_mnogoletnemu

Reset
()

Баг 12309 решен окончательно!

 ,

Reset
()

Google Stadia всё

 ,

Google хоронит очередной проект: https://youtu.be/_iE_QY6LQYc?t=276

Reset
()

В дефиците видеокарт виноват Илон Маск

 , ,

Reset
()

Провал года

 ,

Ожидаемый провал года. Оформляйте возвраты пока не поздно: https://youtu.be/Ien7Mxkq4xM

Reset
()

IT'шники признаны богатыми и теперь будут платить 15% НДФЛ

 

Сабж. https://lenta.ru/news/2020/11/23/nalog/ Я напомню, что 5000000 рублей это всёго лишь $65k. В США за эти деньги даже стажер не будет работать.

Reset
()

Bethesda всё, а вместе с ней возможно и Playstation

 , ,

Microsoft покупает Bethesda со всеми потрохами: https://www.ixbt.com/news/2020/09/21/microsoft-bethesda-xbox-playstation-2.html

Reset
()