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

А ну и 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 сегодня), ну мало ли…

Так а второй AddExec2 вы всё ещё не убрали, получается? Он мешается, потому что в логах выглядит очень похоже на первый. Уберите его и киньте вывод ещё раз. И ту вставку ещё немного поправьте:

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

Так текст ошибки не должно накладывать поверх вывода…

#pragma OPENCL EXTENSION cl_khr_fp64: enable


#define ValAt(B,X,Y) (B)[(X) + (Y)*W]

__kernel void CalcTick(__global double* B, __global double* BRes, int W)
{
	int X = get_global_id(0);
	int Y = get_global_id(1);
	
	int c = 1;
	double sum = ValAt(B, X,Y);
	
	if (X != 0)   { c++; sum += ValAt(B, X-1,Y-0); }
	if (Y != 0)   { c++; sum += ValAt(B, X-0,Y-1); }
	if (X != W-1) { c++; sum += ValAt(B, X+1,Y+0); }
	if (Y != W-1) { c++; sum += ValAt(B, X+0,Y+1); }
	
	ValAt(BRes, X,Y) = sum / c;
}



OpenCLABCBase.ConstQueue`1[System.Double[,]]
========================================
OpenCLABCBase.BufferCommandQueue
Logging state change of cl_event[482579504] 
  1 | 00:00:00.0005743 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0508939 | State changed when: Status of user ev set[it's True] to COMPLETE 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[482579504] 
  1 | 00:00:00.0005743 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0508939 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0739697 | Released when: last ev of CLTask, together with evs: cl_event[482579504] 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[482579504] 
  1 | 00:00:00.0005743 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0508939 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0739697 | Released when: last ev of CLTask, together with evs: cl_event[482579504] 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[482579504] 
  1 | 00:00:00.0005743 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0508939 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0739697 | Released when: last ev of CLTask, together with evs: cl_event[482579504] 
------------------------------
Logging state change of cl_event[482591072] 
  1 | 00:00:03.2240561 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:03.2251483 | Retained when: Tracking state change 
  2 | 00:00:03.2291303 | State changed when: Set to COMPLETE 
  1 | 00:00:03.2293602 | Released when: Finished tracking state change 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[482579504] 
  1 | 00:00:00.0005743 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0508939 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0739697 | Released when: last ev of CLTask, together with evs: cl_event[482579504] 
------------------------------
Logging state change of cl_event[482591072] 
  1 | 00:00:03.2240561 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:03.2251483 | Retained when: Tracking state change 
  2 | 00:00:03.2291303 | State changed when: Set to COMPLETE 
  1 | 00:00:03.2293602 | Released when: Finished tracking state change 
------------------------------
========================================
OpenCLABCBase.KernelCommandQueue
Logging state change of cl_event[482579504] 
  1 | 00:00:00.0005743 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0508939 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0739697 | Released when: last ev of CLTask, together with evs: cl_event[482579504] 
------------------------------
Logging state change of cl_event[482591072] 
  1 | 00:00:03.2240561 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:03.2251483 | Retained when: Tracking state change 
  2 | 00:00:03.2291303 | State changed when: Set to COMPLETE 
  1 | 00:00:03.2293602 | Released when: Finished tracking state change 
------------------------------
Logging state change of cl_event[482591344] 
  1 | 00:00:05.3136505 | Retained when: Created for abortability of EventList.Combine of: cl_event[482591072] 
  1 | 00:00:05.3140855 | State changed when: Status of user ev set[it's True] to COMPLETE 
------------------------------
Logging state change of cl_event[482591712] 
  1 | 00:00:05.3167510 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [cl_event[482591072] cl_event[482591344]] 
  2 | 00:00:05.3167625 | Retained when: Tracking state change 
  2 | 00:00:05.3175886 | State changed when: Set to COMPLETE 
  1 | 00:00:05.3175941 | Released when: Finished 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) в 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_command_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:строка 2931
   в 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:строка 2935
   в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4609
   в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4715
   в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4719
   в 2DTest.Program.$Main() в C:\Users\Миша\Downloads\Симуляция тепла\2DTest.pas:строка 27
   в 2DTest.Program.Main()

AddExec2-ов в логах всё ещё 2 шт. Вы точно второй убрали?

Да, забыл

OpenCLABCBase.ConstQueue`1[System.Double[,]]
========================================
OpenCLABCBase.BufferCommandQueue
Logging state change of cl_event[481531072] 
  1 | 00:00:00.0004613 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0269925 | State changed when: Status of user ev set[it's True] to COMPLETE 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481531072] 
  1 | 00:00:00.0004613 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0269925 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0245634 | Released when: last ev of CLTask, together with evs: cl_event[481531072] 
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481531072] 
  1 | 00:00:00.0004613 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0269925 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0245634 | Released when: last ev of CLTask, together with evs: cl_event[481531072] 
------------------------------
========================================
OpenCLABCBase.KernelCommandQueue
Logging state change of cl_event[481531072] 
  1 | 00:00:00.0004613 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0269925 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:01.0245634 | Released when: last ev of CLTask, together with evs: cl_event[481531072] 
------------------------------
Logging state change of cl_event[481542496] 
  1 | 00:00:03.0798821 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:03.0810280 | Retained when: Tracking state change 
  2 | 00:00:03.0848762 | State changed when: Set to COMPLETE 
  1 | 00:00:03.0850599 | Released when: Finished tracking state change 
------------------------------
Logging state change of cl_event[481543488] 
  1 | 00:00:03.0827066 | Retained when: Created for abortability of QueueRes with .ev: cl_event[481542496] 
  1 | 00:00:03.1009452 | State changed when: Status of user ev set[it's True] to COMPLETE 
------------------------------
========================================
Необработанное исключение: 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_command_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:строка 2931
   в 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:строка 2935
   в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4609
   в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4715
   в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4719
   в 2DTest.Program.$Main() в C:\Users\Миша\Downloads\Симуляция тепла\2DTest.pas:строка 27
   в 2DTest.Program.Main()

Мда, я всё ещё ничего не понимаю. Вроде всё правильно, так же как у меня. Но потом AccessViolationException на ровном месте. Давайте пробовать по-другому:

  1. Всё кроме Writeln(self.GetType); вырежьте и перенесите в EventList.ToMarker, прямо перед строчкой с cl.EnqueueMarkerWithWaitList.

  2. Добавьте после этих строчек и перед cl.EnqueueMarkerWithWaitList следующее:

var ref_c: cardinal := -1;
Writeln('cq:');
cl.GetCommandQueueInfo(cq, CommandQueueInfo.QUEUE_REFERENCE_COUNT, new UIntPtr(sizeof(cardinal)), ref_c, IntPtr.Zero);
Writeln(ref_c);

self.evs.Take(self.count).Println;
for var i := 0 to self.count-1 do
begin
  ref_c := -1;
  Writeln($'{self.evs[i]}:');
  cl.GetEventInfo(self.evs[i], EventInfo.EVENT_REFERENCE_COUNT, new UIntPtr(sizeof(cardinal)), ref_c, IntPtr.Zero);
  Writeln(ref_c);
end;
OpenCLABCBase.ConstQueue`1[System.Double[,]]
OpenCLABCBase.BufferCommandQueue
OpenCLABCBase.ConstQueue`1[System.Int32]
OpenCLABCBase.ConstQueue`1[System.Int32]
OpenCLABCBase.KernelCommandQueue
Logging state change of cl_event[480089136] 
  1 | 00:00:00.0004147 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:  
  1 | 00:00:00.0351831 | State changed when: Status of user ev set[it's True] to COMPLETE 
  0 | 00:00:00.0427587 | Released when: last ev of CLTask, together with evs: cl_event[480089136] 
------------------------------
Logging state change of cl_event[480103840] 
  1 | 00:00:00.0999594 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [] 
  2 | 00:00:00.1008015 | Retained when: Tracking state change 
  2 | 00:00:00.1042887 | State changed when: Set to COMPLETE 
  1 | 00:00:00.1044368 | Released when: Finished tracking state change 
------------------------------
Logging state change of cl_event[480104832] 
  1 | 00:00:00.1036540 | Retained when: Created for abortability of QueueRes with .ev: cl_event[480103840] 
  1 | 00:00:00.1204817 | State changed when: Status of user ev set[it's True] to COMPLETE 
------------------------------
========================================
cq:
1
cl_event[480103840] cl_event[480104832]
cl_event[480103840]:
11
cl_event[480104832]:
11
Необработанное исключение: 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()

Проблема вообще не в текущих объектах, а чём то пока что за гранью человеческого (по крайней мере моего) понимания…

Какая у вас видеокарта? (то есть кто производитель, NVidia, AMD, INTEL и т.п.)
И вы уверены что у вас последняя версия драйверов видеокарты (они так же много где называются графическими драйверами)?

Да и ещё, будет очень тупо если сработает, но попробуйте в любом месте основной программы воткнуть {$platformtarget x86}.

image С директивой ошибка всё равно появляется

Ого, ещё с 2012 года… Вот эта страница может подобрать вам нужный драйвер для вашей видеокарты.
Альтернативно - можно поставить GeForce Experience, он вам автоматом будет драйвера обновлять (и даст ещё пару плюшек нвидии, как Alt+Z). Я у себя поставил на скачивать автоматом и затем спрашивать когда применить обновление.

Стоит, да и дрова недавно ручками скачивал

Самое молодое из имеющегося :slight_smile: