diff --git "a/Samples/OpenCLABC/0\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\270\320\265 \320\277\321\200\320\270\320\274\320\265\321\200\321\213/MatrMlt.pas" "b/Samples/OpenCLABC/0\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\270\320\265 \320\277\321\200\320\270\320\274\320\265\321\200\321\213/MatrMlt.pas" index 9222d213..54dd906c 100644 --- "a/Samples/OpenCLABC/0\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\270\320\265 \320\277\321\200\320\270\320\274\320\265\321\200\321\213/MatrMlt.pas" +++ "b/Samples/OpenCLABC/0\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\270\320\265 \320\277\321\200\320\270\320\274\320\265\321\200\321\213/MatrMlt.pas" @@ -44,13 +44,15 @@ // Подготовка очередей выполнения var Calc_C_Q := + // Можно передавать результаты .ThenWriteArray2 + // вместо "A" и "B" в "MatrMltMatr", но тогда + // они будут тратить лишние ресурсы на параллельность + A.MakeCCQ.ThenWriteArray2(A_Matr) + + B.MakeCCQ.ThenWriteArray2(B_Mart) + // Выделяем ядра в форме квадрата, всего W*W ядер code['MatrMltMatr'].MakeCCQ.ThenExec2(W, W, - A.MakeCCQ.ThenWriteArray2(A_Matr), - B.MakeCCQ.ThenWriteArray2(B_Mart), - C, - W - // DiscardResult не обязательно, но желательно + A, B, C, W + // .DiscardResult не обязателен, но желателен // чтобы не использовать результат случайно ).DiscardResult; @@ -64,11 +66,9 @@ end, false).DiscardResult; var Calc_V2_Q := + V1.MakeCCQ.ThenWriteArray(V1_Arr) + code['MatrMltVec'].MakeCCQ.ThenExec1(W, - C, - V1.MakeCCQ.ThenWriteArray(V1_Arr), - V2, - W + C, V1, V2, W ).DiscardResult; var Otp_V2_Q := @@ -78,9 +78,9 @@ 'Вектор V2 = C*V1:'.Println; V2_Arr.Println; Println; - // Единственный DiscardResult, меняющий поведение очереди: - // С ним не выделяются ресурсы на то, чтобы передать V2_Arr - // Из результата ThenGetArray1 в результат SyncInvoke + // Единственный .DiscardResult, меняющий поведение очереди: + // С ним не выделяются ресурсы на передачу V2_Arr + // Из результата .ThenGetArray1 в результат SyncInvoke end, false).DiscardResult; // Выполнение всего и сразу асинхронный вывод @@ -88,7 +88,9 @@ CLContext.Default.SyncInvoke( Calc_C_Q + - Calc_V2_Q * Otp_C_Q + // Считать V2 и выводить C можно одновременно, поэтому тут *, т.е. параллельное выполнение + // Считать V2 и выводить C можно одновременно, + // поэтому тут *, т.е. параллельное выполнение + Calc_V2_Q * Otp_C_Q + Otp_V2_Q ); @@ -101,8 +103,8 @@ V1.Dispose; V2.Dispose; except - // except позволяет получать список ошибку, - // возникшую при выполнении SyncInvoke + // except позволяет получать список ошибок, + // возникших при выполнении SyncInvoke on ae: System.AggregateException do foreach var e in ae.InnerExceptions do Println(e); diff --git "a/Samples/OpenCLABC/0\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\270\320\265 \320\277\321\200\320\270\320\274\320\265\321\200\321\213/MatrMlt.td" "b/Samples/OpenCLABC/0\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\270\320\265 \320\277\321\200\320\270\320\274\320\265\321\200\321\213/MatrMlt.td" index 809aa35f..a3328e67 100644 --- "a/Samples/OpenCLABC/0\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\270\320\265 \320\277\321\200\320\270\320\274\320\265\321\200\321\213/MatrMlt.td" +++ "b/Samples/OpenCLABC/0\320\237\321\200\320\276\321\201\321\202\320\265\320\271\321\210\320\270\320\265 \320\277\321\200\320\270\320\274\320\265\321\200\321\213/MatrMlt.td" @@ -38,28 +38,26 @@ OpenCLABC_implementation______.InvokeParamsFunc = function(enq_c: integer; o_ final = ErrHandlerBranchCombinator#0: CLArrayCommandGetArrayAutoSize origin+par+enq union branch#0/2 = ErrHandlerInitial#1: ExecuteEnqFunc container branch#1/2 = ErrHandlerBranchCombinator#2: CLTaskGlobalData.ParallelInvoke branches union - origin = ErrHandlerBranchCombinator#3: CLKernelCommandExec2 origin+par+enq union - branch#0/3 = ErrHandlerInitial#4: ExecuteEnqFunc container - branch#1/3 = ErrHandlerInitial#5: ExecuteEnqFunc container - branch#2/3 = ErrHandlerInitial#6: ExecuteEnqFunc container - branch#0/2 = ErrHandlerBranchCombinator#7: CLKernelCommandExec1 origin+par+enq union - branch#0/3 = ErrHandlerInitial#8: ExecuteEnqFunc container - branch#1/3 = ErrHandlerBranchBud#9: branch invoke - origin = ErrHandlerBranchCombinator#3: CLKernelCommandExec2 origin+par+enq union - branch#2/3 = ErrHandlerInitial#10: ExecuteEnqFunc container - branch#1/2 = ErrHandlerBranchCombinator#11: CLArrayCommandGetArray2 origin+par+enq union - branch#0/2 = ErrHandlerInitial#12: ExecuteEnqFunc container - branch#1/2 = ErrHandlerBranchBud#13: branch invoke - origin = ErrHandlerBranchCombinator#3: CLKernelCommandExec2 origin+par+enq union -(total 14 handlers) -[EventDebug]: 13 event's created -[QueueDebug]: 3 queue's created + origin = ErrHandlerInitial#3: ExecuteEnqFunc container + branch#0/2 = ErrHandlerBranchCombinator#4: CLKernelCommandExec1 origin+par+enq union + branch#0/2 = ErrHandlerInitial#5: ExecuteEnqFunc container + branch#1/2 = ErrHandlerBranchCombinator#6: CLArrayCommandWriteArrayAutoSize origin+par+enq union + branch#0/2 = ErrHandlerInitial#7: ExecuteEnqFunc container + branch#1/2 = ErrHandlerBranchBud#8: branch invoke + origin = ErrHandlerInitial#3: ExecuteEnqFunc container + branch#1/2 = ErrHandlerBranchCombinator#9: CLArrayCommandGetArray2 origin+par+enq union + branch#0/2 = ErrHandlerInitial#10: ExecuteEnqFunc container + branch#1/2 = ErrHandlerBranchBud#11: branch invoke + origin = ErrHandlerInitial#3: ExecuteEnqFunc container +(total 12 handlers) +[EventDebug]: 10 event's created +[QueueDebug]: 2 queue's created [ExecDebug]: 2 cache entries created -[QueueResNil]: 20 -[QueueRes]: 15 +[QueueResNil]: 23 +[QueueRes]: 12 QueueResValDirect: 3 QueueResValDirect: 2 - QueueResValDirect>: 5 + QueueResValDirect>: 2 QueueResValDirect: 5 #ReqModules