Я провёл несколько значительных изменений в процессе упаковки OpenCLABC.
Справка OpenCLABC переведена в вид html: Справка OpenCLABC.html (61,1 КБ)
Если б случайно не наткнулся на MarkDig - я, наверное, ещё б не скоро начал)) Маркдаун таки тащит! Особенно в такой оптимизированной и настраиваемой реализации.
Насчёт чистки грамотности - я в первую очередь жду @Kotov (хотя если кто хочет - можете прислать пулл или, хотя бы, сказать где что неграмотно).
А вот насчёт дизайна - вопрос ко всем, что можно улучшить? Я вижу что выглядит как то сухо, но делать красиво - в целом не очень умею.
Остальные русские тексты тоже вытащены из .pas файла, в отдельные файлы. В основном это касается описаний методов и классов, но я хочу туда же и тексты исключений отправить. Эти файлы можно найти тут: https://github.com/SunSerega/POCGL/tree/master/Packing/Doc/OpenCLABC
Файлы, начинающиеся с цифры 0 - это всякие внутренности. Сами тексты в остальных файлах.
@Admin, ещё будет время перед принятием пула (и я тогда напомню тоже), но раньше - лучше:
Если хотите к чему то придраться в формулировках - делайте это до принятия пула. Сейчас, когда все русские тексты находятся в отдельных файлах - должно быть особо просто пройтись по всему.
Менять то, что попадает в готовый билд, без возможности для меня вовремя вставить свою ревизию - это очень некрасиво.
Я сейчас бегло просмотрел справку - мне всё нравится по большому счёту. Всё грамотно и основательно.
Возможно, где-то не хватает пары запятых, но это сущие мелочи.
Страницы, как уже сказал - делал в маркдауне, а в HTML преобразовывал библиотекой MarkDig.
Основа (то есть 2 прямоугольника и передвигаемая перегородка между ними) - это чистый HTML + js + css. Вот 3 соответствующих файла.
(HTML код сохранён в .md файле, но синтаксис маркдауна разрешает вставлять HTML код напрямую)
Ну и всё вместе собирает этот .pas файл, к нему же подключён и MarkDig.
Странные у вас понятия о читабельности. Теперь ещё и без подсветки, то есть однозначно хуже. Вообще можно было в Ctrl+Shift+C поменять чтоб без подсветки не оставаться… Хотя в идеале вообще из IDE паскаля скринить.
В оригинале ударение было на выражения, которые передаёт в SyncInvoke. А в этом варианте чтоб увидеть где каждое из них заканчивается - надо вглядываться и считать скобки. Это плохо.
Форматировал код - ручками. То есть если вставить код в <pre><code>код</code></pre> - пробелы не убивает. И маркдаун уже сам создаёт оба этих блока (но для инлайн кода, то есть (`код`) - блок pre не создаётся, он там не нужен).
А подсветка - это всего лишь немного магического регекс-говнокода. Вот этот код.
Сразу над ним - код, заставляющий работать спойлеры. К примеру вот кусок со страницы Очередь >> Создание очередей:
Важнее какая битность видеокарты… Вот эта программа её выведет:
uses OpenCLABC;
begin
Context.Default.MainDevice
.Properties.AddressBits
.ToString.Println;
end.
А если и тут 64 скажет - значит таки во всех программах с double или int64 нужна своя строчка #pragma…
Вообще уже было такое что реализация на моей NVidia тупо молчит о предупреждении, в том время как другие реализации дают ошибку вместо этого предупреждения.
А вот это уже больно… Через 40 мин. смогу нормально сесть и давать инструкции как отдебажить эту проблему.
Можете пока попробовать найти минимальный код с которым воспроизводится. Это сильно упростит весь дебаг далее.
Нет, эта ошибка значит что программа пыталась использовать область памяти, которая ей уже не принадлежит, потому что была освобождена. При работе с неуправляемым кодом таки баги повсюду… Но ловить их от этого не легче.
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 то ошибка не выводится