Убрал упоминания issue 1981
This commit is contained in:
parent
3aa835381d
commit
1b575d156f
|
|
@ -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
|
||||
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ begin
|
|||
|
||||
// Выполнение
|
||||
|
||||
prog['TEST'].Exec1(10, // используем 10 ядер
|
||||
prog['TEST'].Exec1(10, // Используем 10 ядер
|
||||
|
||||
// Заполняем весь буфер значениями (1), прямо перед выполнением
|
||||
// Тип значения integer, потому что это тип по-умолчанию для целых чисел
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -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(()->new Buffer(1)),
|
||||
// В том числе BufferCommandQueue
|
||||
Buffer.Create(1).NewQueue as CommandQueue<Buffer>,
|
||||
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<Buffer> ) );
|
||||
OtpObject( Context.Default.SyncInvoke( b0.NewQueue ) );
|
||||
|
||||
// Тип - Int32 (то есть integer), потому что это тип по умолчанию для выражения (5)
|
||||
OtpObject( Context.Default.SyncInvoke( HFQ( ()->5 ) ) );
|
||||
|
|
@ -1425,9 +1425,7 @@ begin
|
|||
q.AddWriteValue(5, 1*sizeof(integer) ).AddWriteValue(7, 2*sizeof(integer) );
|
||||
// Все команды в q будут выполняться последовательно
|
||||
|
||||
// В данной версии надо писать "as CommandQueue<...>" при использовании [Buffer/Kernel]CommandQueue там,
|
||||
// где принимает CommandQueue<...>, из за бага компилятора #1981
|
||||
Context.Default.SyncInvoke(q as CommandQueue<Buffer>);
|
||||
Context.Default.SyncInvoke(q);
|
||||
|
||||
// Вообще чтение тоже надо делать через очереди, но для простого примера - и неявные очереди подходят
|
||||
b.GetArray1&<integer>(3).Println;
|
||||
|
|
@ -1447,20 +1445,18 @@ var q := new BufferCommandQueue(q0);
|
|||
</code></pre>
|
||||
<p>Этот код присваевает переменной <code>q</code> константную очередь, которая ничего не выполняет и возвращает <code>5</code>.</p>
|
||||
<p>Получить значение, из которого создали константную очередь, можно преобразовав её к <code>ConstQueue<></code>:</p>
|
||||
<pre><code>var cq := q as ConstQueue<integer>;
|
||||
if cq=nil then
|
||||
Writeln('Очередь не константная') else
|
||||
Writeln($'Очередь была создана из значения ({cq.Val})');
|
||||
<pre><code>if q is ConstQueue<integer>(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->results.JoinToString, // функция преобразования
|
||||
results->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<Buffer>
|
||||
;
|
||||
|
||||
var Q_BuffRead := b.NewQueue.AddReadArray1&<integer>(A) as CommandQueue<Buffer>;
|
||||
|
||||
var Q_Otp := HPQ(()->
|
||||
begin
|
||||
A.Println;
|
||||
end);
|
||||
var Q_BuffRead :=
|
||||
b.NewQueue.AddGetArray1&<integer>
|
||||
.ThenConvert(A->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&<integer>(A);
|
||||
|
||||
// Аналог Q_Otp
|
||||
A.Println;
|
||||
b.GetArray1&<integer>.Println;
|
||||
|
||||
end.
|
||||
</code></pre>
|
||||
|
|
|
|||
2270
bin/Lib/OpenCL.pas
2270
bin/Lib/OpenCL.pas
File diff suppressed because it is too large
Load diff
|
|
@ -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}
|
||||
|
||||
|
|
|
|||
10821
bin/Lib/OpenGL.pas
10821
bin/Lib/OpenGL.pas
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue