Убрал упоминания issue 1981

This commit is contained in:
SunSerega 2021-01-08 19:41:44 +02:00
parent 3aa835381d
commit 1b575d156f
7 changed files with 4309 additions and 8896 deletions

View file

@ -6,9 +6,6 @@ const
VecByteSize = MatrW*8;
MatrByteSize = MatrW*MatrW*8;
//ToDo issue компилятора:
// - #1981
begin
try
Randomize(0); // делает так, чтобы каждое выполнение давало одинаковый результат
@ -55,16 +52,15 @@ begin
var Calc_C_Q :=
code['MatrMltMatr'].NewQueue.AddExec2(MatrW, MatrW, // Выделяем ядра в форме квадрата, всего MatrW*MatrW ядер
A.NewQueue.AddWriteArray2&<real>(A_Matr),
A.NewQueue.AddWriteArray2&<real>(A_Matr), // Тип в &<> надо указывать явно, потому что компилятор не может вычислить его из типа элементов массива
B.NewQueue.AddWriteArray2&<real>(B_Mart),
C,
W
) as CommandQueue<Kernel>;
);
var Otp_C_Q :=
C.NewQueue.AddReadArray2&<real>(A_Matr) +
HPQ(()->
lock output do
begin
'Матрица С = A*B:'.Println;
A_Matr.Println;
@ -77,12 +73,11 @@ begin
V1.NewQueue.AddWriteArray1&<real>(V1_Arr),
V2,
W
) as CommandQueue<Kernel>;
);
var Otp_V2_Q :=
V2.NewQueue.AddReadArray1&<real>(V1_Arr) +
HPQ(()->
lock output do
begin
'Вектор V2 = C*V1:'.Println;
V1_Arr.Println;
@ -94,13 +89,8 @@ begin
Context.Default.SyncInvoke(
Calc_C_Q +
(
Otp_C_Q * // выводить C и считать V2 можно одновременно, поэтому тут *, т.е. параллельное выполнение
(
Calc_V2_Q +
Otp_V2_Q
)
)
Calc_V2_Q * Otp_C_Q + // Считать V2 и выводить C можно одновременно, поэтому тут *, т.е. параллельное выполнение
Otp_V2_Q
);

View file

@ -12,7 +12,7 @@ begin
// Выполнение
prog['TEST'].Exec1(10, // используем 10 ядер
prog['TEST'].Exec1(10, // Используем 10 ядер
// Заполняем весь буфер значениями (1), прямо перед выполнением
// Тип значения integer, потому что это тип по-умолчанию для целых чисел

View file

@ -23,7 +23,9 @@ begin
var F := NamedQ('F');
Context.Default.SyncInvoke(
(A + (B+D)*(C+F) ) *
A +
(B+D) *
(C+F) *
(WaitForAll(B,C) + E)
);

View file

@ -947,7 +947,7 @@ window.onload = ()=>{
<script>on_start_folder("Простые оболочки", document.getElementById("page-3"))</script>
<div id="page-4" page_name="" hidden=true>
<p>В списке устройств контекста могут быть только совместимые друг с другом устройства.<br />
Совместимые устройства объединяются в общих платформах (объектах типа <code>Platform</code>).</p>
Коллекция совместимых устройств называется платформой и хранится в объектах типа <code>Platform</code>.</p>
<hr />
<p>Обычно платформы получают из статического свойства <code>Platform.All</code>:</p>
<pre><code>uses OpenCLABC;
@ -1013,8 +1013,8 @@ end.
<p>Изначально этому свойству присваивается контекст, использующий GPU, если оно имеется,
или любое другое устройство, поддерживающее OpenCL, если GPU отсутствует.</p>
<p>Если устройств поддерживающих <code>OpenCL</code> нет - <code>Context.Default</code> будет <code>nil</code>.<br />
Однако такая ситуация теоретически невозможна, потому что OpenCL поддерживается
всеми современными устройствами, занимающимися выводом изображения на экран.<br />
Однако такая ситуация на практике невозможна, потому что OpenCL поддерживается
практически всеми современными устройствами, занимающимися выводом изображения на экран.<br />
Если <code>Context.Default = nil</code> - переустановите графические драйверы.</p>
<hr />
<p><code>Context.Default</code> можно перезаписывать.<br />
@ -1098,7 +1098,7 @@ begin
// Очередь возвращающую буфер
HFQ(()-&gt;new Buffer(1)),
// В том числе BufferCommandQueue
Buffer.Create(1).NewQueue as CommandQueue&lt;Buffer&gt;,
Buffer.Create(1).NewQueue,
// Размерное значение
val1,
@ -1107,7 +1107,7 @@ begin
// И указатель на размерное значение
// (в kernel попадёт само значение, не указатель)
@val2,
// Так нельзя, потому что val1 уже захвачена лямбдой HFQ
// Так нельзя, потому что val1 уже захвачена лямбдой из HFQ
// @val1,
// Расширенный набор параметров
KernelArg.FromPtr(new System.IntPtr(@val2), new System.UIntPtr(sizeof(integer)))
@ -1314,7 +1314,7 @@ begin
var b0 := new Buffer(1);
// Тип - буфер, потому что очередь создали из буфера
OtpObject( Context.Default.SyncInvoke( b0.NewQueue as CommandQueue&lt;Buffer&gt; ) );
OtpObject( Context.Default.SyncInvoke( b0.NewQueue ) );
// Тип - Int32 (то есть integer), потому что это тип по умолчанию для выражения (5)
OtpObject( Context.Default.SyncInvoke( HFQ( ()-&gt;5 ) ) );
@ -1425,9 +1425,7 @@ begin
q.AddWriteValue(5, 1*sizeof(integer) ).AddWriteValue(7, 2*sizeof(integer) );
// Все команды в q будут выполняться последовательно
// В данной версии надо писать &quot;as CommandQueue&lt;...&gt;&quot; при использовании [Buffer/Kernel]CommandQueue там,
// где принимает CommandQueue&lt;...&gt;, из за бага компилятора #1981
Context.Default.SyncInvoke(q as CommandQueue&lt;Buffer&gt;);
Context.Default.SyncInvoke(q);
// Вообще чтение тоже надо делать через очереди, но для простого примера - и неявные очереди подходят
b.GetArray1&amp;&lt;integer&gt;(3).Println;
@ -1447,20 +1445,18 @@ var q := new BufferCommandQueue(q0);
</code></pre>
<p>Этот код присваевает переменной <code>q</code> константную очередь, которая ничего не выполняет и возвращает <code>5</code>.</p>
<p>Получить значение, из которого создали константную очередь, можно преобразовав её к <code>ConstQueue&lt;&gt;</code>:</p>
<pre><code>var cq := q as ConstQueue&lt;integer&gt;;
if cq=nil then
Writeln('Очередь не константная') else
Writeln($'Очередь была создана из значения ({cq.Val})');
<pre><code>if q is ConstQueue&lt;integer&gt;(var cq) then
Writeln($'Очередь была создана из значения ({cq.Val})') else
Writeln($'Очередь не константная');
</code></pre>
<hr />
<p><code>CommandQueueBase</code> также можно создать из возвращаемого значения, но для этого тип значения должен быть <code>Object</code>:</p>
<pre><code>var q: CommandQueueBase := 5 as object;
</code></pre>
<p>Чтобы получить значение, из которого создали константную очередь, когда не знаете его тип - используйте интерфейс <code>IConstQueue</code>:</p>
<pre><code>var cq := q as IConstQueue;
if cq=nil then
Writeln('Очередь не константная') else
Writeln($'Очередь была создана из значения ({cq.GetConstVal})');
<pre><code>if q is IConstQueue(var cq) then
Writeln($'Очередь была создана из значения ({cq.GetConstVal})') else
Writeln($'Очередь не константная');
</code></pre>
</div>
<script>on_page_added(document.getElementById("page-17"))</script>
@ -1587,7 +1583,7 @@ begin
// А точнее их перегрузку, первый параметр которой - функция преобразования
Context.Default.SyncInvoke(
CombineSyncQueue(
results-&gt;results.JoinToString, // функция преобразования
results-&gt;results.JoinToString, // Функция преобразования
q1, q2
)
).Println;
@ -1953,26 +1949,21 @@ end.
begin
var b := new Buffer( 3*sizeof(integer) );
var A := new integer[3];
var Q_BuffWrite := b.NewQueue
.AddWriteValue(1, 0*sizeof(integer) )
.AddWriteValue(5, 1*sizeof(integer) )
.AddWriteValue(7, 2*sizeof(integer) )
as CommandQueue&lt;Buffer&gt;
;
var Q_BuffRead := b.NewQueue.AddReadArray1&amp;&lt;integer&gt;(A) as CommandQueue&lt;Buffer&gt;;
var Q_Otp := HPQ(()-&gt;
begin
A.Println;
end);
var Q_BuffRead :=
b.NewQueue.AddGetArray1&amp;&lt;integer&gt;
.ThenConvert(A-&gt;A.Println);
;
Context.Default.SyncInvoke(
Q_BuffWrite +
Q_BuffRead +
Q_Otp
Q_BuffRead
);
end.
@ -1982,7 +1973,6 @@ end.
begin
var b := new Buffer( 3*sizeof(integer) );
var A := new integer[3];
// Аналог Q_BuffWrite
b.WriteValue(1, 0*sizeof(integer) );
@ -1990,10 +1980,7 @@ begin
b.WriteValue(7, 2*sizeof(integer) );
// Аналог Q_BuffRead
b.ReadArray1&amp;&lt;integer&gt;(A);
// Аналог Q_Otp
A.Println;
b.GetArray1&amp;&lt;integer&gt;.Println;
end.
</code></pre>

File diff suppressed because it is too large Load diff

View file

@ -130,11 +130,9 @@ unit OpenCLABCBase;
//ToDo Issue компилятора:
//ToDo https://github.com/pascalabcnet/pascalabcnet/issues/{id}
// - #1981
// - #2145
// - #2221
// - #2289
// - #2290
// - #2398
//ToDo Баги NVidia
//ToDo https://developer.nvidia.com/nvidia_bug/{id}
@ -2886,7 +2884,7 @@ type
public function ThenConvert<TOtp>(f: (T, Context)->TOtp): CommandQueue<TOtp>;
protected function ThenConvertBase<TOtp>(f: (object, Context)->TOtp): CommandQueue<TOtp>; override :=
ThenConvert(f as object as Func2<T, Context, TOtp>);
ThenConvert(f as object as Func2<T, Context, TOtp>); //ToDo #2221
{$endregion ThenConvert}
@ -2909,7 +2907,7 @@ type
///Подробнее в справке: "Очередь>>Создание очередей>>Множественное использование очереди"
public function Multiusable: ()->CommandQueue<T>;
protected function MultiusableBase: ()->CommandQueueBase; override := Multiusable as object as Func<CommandQueueBase>; //ToDo #2221
protected function MultiusableBase: ()->CommandQueueBase; override := Multiusable() as object as Func<CommandQueueBase>; //ToDo #2221
{$endregion Multiusable}
@ -3019,7 +3017,7 @@ type
end;
private constructor := raise new InvalidOperationException($'Был вызван не_применимый конструктор без параметров... Обратитесь к разработчику OpenCLABC');
public function GetQS: sequence of CommandQueueBase := qs.Append(last as CommandQueueBase); //ToDo #? https://github.com/pascalabcnet/pascalabcnet/issues?q=extensionmethod+is%3Aclosed
public function GetQS: sequence of CommandQueueBase := qs.Append(last as CommandQueueBase);
protected procedure RegisterWaitables(tsk: CLTaskBase; prev_hubs: HashSet<MultiusableCommandQueueHubBase>); override;
begin
@ -3528,7 +3526,7 @@ type
var next := enmr.MoveNext;
if not (curr is IConstQueue) or not next then
if curr as object is T(var sqa) then //ToDo #2290
if curr is T(var sqa) then
res.AddRange(sqa.GetQS) else
res += curr;
@ -4345,7 +4343,7 @@ type
///Создаёт аргумент kernel-а, представляющий буфер
public static function FromBufferCQ(bq: CommandQueue<Buffer>): KernelArg;
public static function operator implicit(bq: CommandQueue<Buffer>): KernelArg := FromBufferCQ(bq);
public static function operator implicit(bq: BufferCommandQueue): KernelArg := FromBufferCQ(bq as CommandQueue<Buffer>);
public static function operator implicit(bq: BufferCommandQueue): KernelArg := FromBufferCQ(bq);
{$endregion Buffer}
@ -4453,9 +4451,10 @@ end;
{$region QueueRes}
static function QueueResDelayedBase<T>.MakeNew(need_ptr_qr: boolean) := need_ptr_qr ?
new QueueResDelayedPtr<T> as QueueResDelayedBase<T> :
new QueueResDelayedObj<T> as QueueResDelayedBase<T>;
static function QueueResDelayedBase<T>.MakeNew(need_ptr_qr: boolean) :=
if need_ptr_qr then
new QueueResDelayedPtr<T> as QueueResDelayedBase<T> else
new QueueResDelayedObj<T> as QueueResDelayedBase<T>;
{$endregion QueueRes}
@ -4859,7 +4858,7 @@ type
end;
static function KernelArg.FromBuffer(b: Buffer) := new KernelArgBuffer(b) as KernelArg; //ToDo #1981
static function KernelArg.FromBuffer(b: Buffer) := new KernelArgBuffer(b);
{$endregion Buffer}
@ -4881,7 +4880,7 @@ type
end;
static function KernelArg.FromRecord<TRecord>(val: TRecord) := new KernelArgRecord<TRecord>(val) as KernelArg; //ToDo #1981
static function KernelArg.FromRecord<TRecord>(val: TRecord) := new KernelArgRecord<TRecord>(val) as KernelArg; //ToDo #2398
{$endregion Record}
@ -4904,7 +4903,7 @@ type
end;
static function KernelArg.FromPtr(ptr: IntPtr; sz: UIntPtr) := new KernelArgPtr(ptr, sz) as KernelArg; //ToDo #1981
static function KernelArg.FromPtr(ptr: IntPtr; sz: UIntPtr) := new KernelArgPtr(ptr, sz);
{$endregion Ptr}
@ -4928,7 +4927,7 @@ type
private constructor := raise new InvalidOperationException($'Был вызван не_применимый конструктор без параметров... Обратитесь к разработчику OpenCLABC');
protected function Invoke(tsk: CLTaskBase; c: Context; main_dvc: cl_device_id): QueueRes<ISetableKernelArg>; override :=
q.InvokeNewQ(tsk, c, main_dvc, false, nil).LazyQuickTransform(b->new KernelArgBuffer(b) as ConstKernelArg as ISetableKernelArg); //ToDo #2289
q.InvokeNewQ(tsk, c, main_dvc, false, nil).LazyQuickTransform(b->new KernelArgBuffer(b) as ISetableKernelArg);
protected procedure RegisterWaitables(tsk: CLTaskBase; prev_hubs: HashSet<MultiusableCommandQueueHubBase>); override :=
q.RegisterWaitables(tsk, prev_hubs);
@ -4936,7 +4935,7 @@ type
end;
static function KernelArg.FromBufferCQ(bq: CommandQueue<Buffer>) :=
new KernelArgBufferCQ(bq) as KernelArg;
new KernelArgBufferCQ(bq);
{$endregion Buffer}
@ -4979,7 +4978,7 @@ type
end;
static function KernelArg.FromRecordCQ<TRecord>(valq: CommandQueue<TRecord>) :=
new KernelArgRecordCQ<TRecord>(valq) as KernelArg;
new KernelArgRecordCQ<TRecord>(valq) as KernelArg; //ToDo #2398
{$endregion Record}
@ -5012,7 +5011,7 @@ type
end;
static function KernelArg.FromPtrCQ(ptr_q: CommandQueue<IntPtr>; sz_q: CommandQueue<UIntPtr>) :=
new KernelArgPtrCQ(ptr_q, sz_q) as KernelArg;
new KernelArgPtrCQ(ptr_q, sz_q);
{$endregion Ptr}

File diff suppressed because it is too large Load diff