Модули для работы с OpenCL и OpenGL

Я провёл несколько значительных изменений в процессе упаковки OpenCLABC.

  1. Справка OpenCLABC переведена в вид html:
    Справка OpenCLABC.html (61,1 КБ)
    Если б случайно не наткнулся на MarkDig - я, наверное, ещё б не скоро начал)) Маркдаун таки тащит! Особенно в такой оптимизированной и настраиваемой реализации.

    Исходники страниц этой справки тут:
    https://github.com/SunSerega/POCGL/tree/master/Packing/Spec/CL%20ABC
    Ну а исходники упаковщика справок - в предыдущей папке.

    Насчёт чистки грамотности - я в первую очередь жду @Kotov (хотя если кто хочет - можете прислать пулл или, хотя бы, сказать где что неграмотно).
    А вот насчёт дизайна - вопрос ко всем, что можно улучшить? Я вижу что выглядит как то сухо, но делать красиво - в целом не очень умею.

  2. Остальные русские тексты тоже вытащены из .pas файла, в отдельные файлы. В основном это касается описаний методов и классов, но я хочу туда же и тексты исключений отправить. Эти файлы можно найти тут:
    https://github.com/SunSerega/POCGL/tree/master/Packing/Doc/OpenCLABC
    Файлы, начинающиеся с цифры 0 - это всякие внутренности. Сами тексты в остальных файлах.

@Admin, ещё будет время перед принятием пула (и я тогда напомню тоже), но раньше - лучше:

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

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

@Sun_Serega, форматирование кода страдает:

Стоит пройтись по всем примерам кода и подправить форматирование.

Все примеры аккуратно отформатированы ручками и проверены.

Если имелись в виду лишние пробелы - попробуй убрать их и понять на сколько уродливо и нечитабельно получается. Лучше уж так.

Термины, которыЕ часто путают новички

Мда, тексты страниц прошёлся проверил, а на названия в итоге и не смотрел))

Но, я имел в виду больше что то типа “кернел”, то есть не ошибки в записи (в том числе грамматические), а то что лично вам не нравится.

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

“Объект типа Kernel” - это очень правильно.

А в чём делали справку и как размечали код?

Страницы, как уже сказал - делал в маркдауне, а в HTML преобразовывал библиотекой MarkDig.

Основа (то есть 2 прямоугольника и передвигаемая перегородка между ними) - это чистый HTML + js + css. Вот 3 соответствующих файла.
(HTML код сохранён в .md файле, но синтаксис маркдауна разрешает вставлять HTML код напрямую)

Ну и всё вместе собирает этот .pas файл, к нему же подключён и MarkDig.

И

совсем не получается (скриншот с Sublime Text).

Странные у вас понятия о читабельности. Теперь ещё и без подсветки, то есть однозначно хуже. Вообще можно было в Ctrl+Shift+C поменять чтоб без подсветки не оставаться… Хотя в идеале вообще из IDE паскаля скринить.

В оригинале ударение было на выражения, которые передаёт в SyncInvoke. А в этом варианте чтоб увидеть где каждое из них заканчивается - надо вглядываться и считать скобки. Это плохо.

1 лайк

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

Да, согласен, но у меня её нет, а устанавливать ради разового скриншота интереса нет.

Новички будут смотреть на Ваш код и ему подражать, если они также станут писать с кучей лишних пробелов, то:

Подумайте надо ли Вам обучать плохому форматированию кода новичков или нет (ведь, на них, в частности, направлены Ваши модули).

А как форматировали код Pascal программы? Подсветка ключевых слов?

Форматировал код - ручками. То есть если вставить код в <pre><code>код</code></pre> - пробелы не убивает. И маркдаун уже сам создаёт оба этих блока (но для инлайн кода, то есть (`код`) - блок pre не создаётся, он там не нужен).

А подсветка - это всего лишь немного магического регекс-говнокода. Вот этот код.

Сразу над ним - код, заставляющий работать спойлеры. К примеру вот кусок со страницы Очередь >> Создание очередей:

:::spoiler { summary="1. Из буфера/kernel-а" hidden=true }

... (тут содержимое скрываемого блока)

:::

А под кодом подсветки особых слов - то что я пару часов назад добавил, подсветка скобок.

Дождался-таки)

1 лайк

В целом всё наконец достаточно стабильно работает, так что создал пулл:

Кому не лень - продитесь по справкам, проверьте на орфографию и т.п.

@ProMix давайте лучше тут обсуждать, а то к трёхмерногому образу это не относится…


Важнее какая битность видеокарты… Вот эта программа её выведет:

uses OpenCLABC;

begin
  Context.Default.MainDevice
  .Properties.AddressBits
  .ToString.Println;
end.

А если и тут 64 скажет - значит таки во всех программах с double или int64 нужна своя строчка #pragma
Вообще уже было такое что реализация на моей NVidia тупо молчит о предупреждении, в том время как другие реализации дают ошибку вместо этого предупреждения.

А вот это уже больно… Через 40 мин. смогу нормально сесть и давать инструкции как отдебажить эту проблему.

Можете пока попробовать найти минимальный код с которым воспроизводится. Это сильно упростит весь дебаг далее.

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

Да, 32

uses OpenCLABC;

const W = 2;

begin
  var B := new Buffer(W*W*sizeof(real));
  B.WriteArray2&<real>(MatrRandomReal(W,W).Println);
  
  var BRes := new Buffer(B.Size);
  
  var code := new ProgramCode(Context.Default, ReadAllText('2D.cl'));
  var k := code['CalcTick'];
  
  var Q_1Cycle: CommandQueueBase := k.NewQueue
    // Сначала читаем предыдущее состояние из B и пишем BRes
    .AddExec2(W,W,
      B, BRes,
      KernelArg.FromRecord(W)
    )
    // А затем то же самое в обратную сторону
    .AddExec2(W,W,
      BRes, B,
      KernelArg.FromRecord(W)
    );
  
  Context.Default.SyncInvoke(Q_1Cycle);
end.

Как-то так. Интересный факт, если закомментировать оба .AddExec2 после k.NewQueue то ошибка не выводится :slight_smile:

А если закомментировать только второй всё ещё выводится?


Замените OpenCLABCBase.pas на этот: OpenCLABCBase.pas (143.4 КБ)

И добавьте в конец программы:

EventDebug.ReportRefCounterInfo;

Вам выведет кучу дебаг информации, скиньте её мне.

Перестаёт выводится только в случае комментирования обоих

OpenCLABC.pas(479) : Неизвестное имя 'ConvSyncQueueArray2'

Ах, ну да… Это я недоупакованную версию скинул.
OpenCLABCBase.pas (350.2 КБ)

Ну тогда минимальный код это таки без второй AddExec.

2DTest.pas(28) : Неизвестное имя 'EventDebug'

Без него всё ещё не работает