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

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

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

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

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

А как форматировали код 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'

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

А ну и OpenCLABCBase надо указать в uses.

А ошибку точно ту же выдаёт?

Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
   в OpenCL.cl.z_EnqueueMarkerWithWaitList_ovr_0(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event& event_wait_list, cl_event& event)
   в OpenCL.cl.EnqueueMarkerWithWaitList(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event[] event_wait_list, cl_event& event) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCL.pas:строка 5319
   в OpenCLABCBase.EventList.ToMarker(cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean expect_smart_status_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2057
   в OpenCLABCBase.EventList.AttachCallback(Action work, CLTaskBase tsk, cl_context c, cl_device_id dvc, cl_command_queue& cq, String reason, Boolean save_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2123
   в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2906
   в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2909
   в OpenCLABCBase.SimpleSyncQueueArray`1.InvokeImpl(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 3099
   в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2905
   в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2909
   в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4570
   в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4675
   в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4678
   в 2D.Program.$Main() в C:\Users\Миша\Downloads\Симуляция тепла\2D.pas:строка 73
   в 2D.Program.Main()

Вроде та же

По моему вы запускаете не тот же код что дали тут.

SimpleSyncQueueArray это тип очереди, который получается при сложении нескольких очередей (в том числе с помощью CombineSyncQueue).
И вместо CLTaskResLess был бы CLTask`1, если бы вы передавали в SyncInvoke результат .AddExec2.

Это был изначальный код. Вот ошибка тестовой версии:

Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
   в OpenCL.cl.z_EnqueueMarkerWithWaitList_ovr_0(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event& event_wait_list, cl_event& event)
   в OpenCL.cl.EnqueueMarkerWithWaitList(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event[] event_wait_list, cl_event& event) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCL.pas:строка 5319
   в OpenCLABCBase.EventList.ToMarker(cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean expect_smart_status_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2057
   в OpenCLABCBase.EventList.AttachCallback(Action work, CLTaskBase tsk, cl_context c, cl_device_id dvc, cl_command_queue& cq, String reason, Boolean save_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2123
   в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2906
   в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2909
   в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4570
   в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4675
   в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4678
   в 2DTest.Program.$Main() в C:\Users\Миша\Downloads\Симуляция тепла\2DTest.pas:строка 27
   в 2DTest.Program.Main()

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


Давайте попробуем ядерный вариант… Залезьте в CommandQueue<T>.Invoke и влепите следующее:

Writeln(self.GetType);
EventDebug.ReportRefCounterInfo;
Readln;

Прямо перед последней строчкой, то есть перед AttachCallback.

Затем запустите и медленно (раз в секунду) тыкайте Enter, пока ошибка не выпадет снова. И посылайте всё что попадёт в вывод.

OpenCLABCBase.ConstQueue`1[System.Double[,]]
========================================

OpenCLABCBase.BufferCommandQueue
Logging state change of cl_event[479826992] 
  1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
------------------------------
========================================

OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[479826992] 
  1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992] 
------------------------------
========================================

OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[479826992] 
  1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992] 
------------------------------
========================================

OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[479826992] 
  1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992] 
------------------------------
Logging state change of cl_event[479838432] 
  1 | 00:00:07.9125960 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:07.9136295 | Retained when: Tracking state change 
------------------------------
========================================

OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[479826992] 
  1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992] 
------------------------------
Logging state change of cl_event[479838432] 
  1 | 00:00:07.9125960 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:07.9136295 | Retained when: Tracking state change 
  2 | 00:00:07.9172604 | State changed when: Set to COMPLETE 
  1 | 00:00:07.9173986 | Released when: Finished tracking state change 
------------------------------
========================================

OpenCLABCBase.KernelCommandQueue
Logging state change of cl_event[479826992] 
  1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992] 
------------------------------
Logging state change of cl_event[479838432] 
  1 | 00:00:07.9125960 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:07.9136295 | Retained when: Tracking state change 
  2 | 00:00:07.9172604 | State changed when: Set to COMPLETE 
  1 | 00:00:07.9173986 | Released when: Finished tracking state change 
------------------------------
Logging state change of cl_event[479838800] 
  1 | 00:00:11.2890673 | Retained when: Created for abortability of EventList.Combine of: cl_event[479838432] 
  1 | 00:00:11.2893235 | State changed when: Status of user ev set[it's True] to COMPLETE 
------------------------------
Logging state change of cl_event[479839168] 
  1 | 00:00:11.2916428 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [cl_event[479838432] cl_event[479838800]] 
  2 | 00:00:11.2916576 | Retained when: Tracking state change 
------------------------------
========================================

Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
   в OpenCL.cl.z_EnqueueMarkerWithWaitList_ovr_0(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event& event_wait_list, cl_event& event)
   в OpenCL.cl.EnqueueMarkerWithWaitList(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event[] event_wait_list, cl_event& event)
   в OpenCLABCBase.EventList.ToMarker(cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean expect_smart_status_err)
   в OpenCLABCBase.EventList.AttachCallback(Action work, CLTaskBase tsk, cl_context c, cl_device_id dvc, cl_command_queue& cq, String reason, Boolean save_err)
   в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev)
   в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev)
   в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c)
   в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q)
   в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q)
   в 2DTest.Program.$Main()
   в 2DTest.Program.Main()

Кхм, ок, задержка немного не там… Тогда замените те 3 строчки на это:

Writeln(self.GetType);
Sleep(1000);
EventDebug.ReportRefCounterInfo;

И, конечно, опять скиньте всё что выведет.

OpenCLABCBase.ConstQueue`1[System.Double[,]]
========================================
OpenCLABCBase.BufferCommandQueue
Logging state change of cl_event[481072176] 
  1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481072176] 
  1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176] 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481072176] 
  1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176] 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481072176] 
  1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176] 
------------------------------
Logging state change of cl_event[481081600] 
  1 | 00:00:03.1195387 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:03.1205947 | Retained when: Tracking state change 
  2 | 00:00:03.1250737 | State changed when: Set to COMPLETE 
  1 | 00:00:03.1252816 | Released when: Finished tracking state change 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481072176] 
  1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176] 
------------------------------
Logging state change of cl_event[481081600] 
  1 | 00:00:03.1195387 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:03.1205947 | Retained when: Tracking state change 
  2 | 00:00:03.1250737 | State changed when: Set to COMPLETE 
  1 | 00:00:03.1252816 | Released when: Finished tracking state change 
------------------------------
========================================
OpenCLABCBase.KernelCommandQueue
Logging state change of cl_event[481072176] 
  1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176] 
------------------------------
Logging state change of cl_event[481081600] 
  1 | 00:00:03.1195387 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:03.1205947 | Retained when: Tracking state change 
  2 | 00:00:03.1250737 | State changed when: Set to COMPLETE 
  1 | 00:00:03.1252816 | Released when: Finished tracking state change 
------------------------------
Logging state change of cl_event[481084032] 
  1 | 00:00:05.1982150 | Retained when: Created for abortability of EventList.Combine of: cl_event[481081600] 
  1 | 00:00:05.1986451 | StateНеобработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
   в OpenCL.cl.z_EnqueueMarkerWithWaitList_ovr_0(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event& event_wait_list, cl_event& event)
   в OpenCL.cl.EnqueueMarkerWithWaitList(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event[] event_wait_list, cl_event& event) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCL.pas:строка 5319
   в OpenCLABCBase.EventList.ToMarker(cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean expect_smart_status_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2072
   в OpenCLABCBase.EventList.AttachCallback(Action work, CLTaskBase tsk, cl_context c, cl_device_id dvc, cl_comm changed when: Status of user ev set[it's True] to COMPLETE 
------------------------------
Logging state change of cl_event[481084304] 
  1 | 00:00:05.2051949 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [cl_event[481081600] cl_event[481084032]] 
  2 | 00:00:05.2052125 | Retained when: Tracking state change 
  2 | 00:00:05.2980747 | State changed when: Set to COMPLETE 
  1 | 00:00:05.2980796 | Released when: Finished tracking state change 
------------------------------
========================================
and_queue& cq, String reason, Boolean save_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2137
   в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2930
   в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2934
   в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4608
   в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4714
   в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4718
   в 2DTest.Program.$Main() в C:\Users\Миша\Downloads\Симуляция тепла\2DTest.pas:строка 27
   в 2DTest.Program.Main()

А и, на всяк, скиньте .cl файл как он у вас сейчас расписан. Вроде я его не менял после того как кинул (кроме #pragma сегодня), ну мало ли…