В качестве упражнения по использованию OpenCl я пишу решатель линейной алгебры. Я хотел бы заменить для l oop внизу вызовом enqueue_kernel
. Моя лучшая догадка закомментирована.
__kernel void ReduceDenseRowForward(__global double* Matrix, __global double* Result, int ReducedRow, int ReadRow, double Factor)
{
int SIZE = get_global_size(0);
int ID = get_global_id(0);
Matrix[SIZE * ReducedRow + ID] -= Matrix[SIZE * ReadRow + ID] * Factor;
Result[ReducedRow] -= Result[ReadRow] * Factor;
}
__kernel void ReduceDenseMatrixForward(__global double* Matrix, __global double* Result, __global volatile int* Leger)
{
int id = get_global_id(0);
int SIZE = get_global_size(0);
int index = id * SIZE;
Leger[id] = -1;
mem_fence(CLK_GLOBAL_MEM_FENCE);
int firstEntry = -1;
int Row;
for(int i = 0;i < id + 1; i++)
{
if(Matrix[index + i] != 0)
{
Row = atomic_cmpxchg(&Leger[i], -1, id);
if(Row == -1) return;
firstEntry = i;
break;
}
}
int RowIndex = Row * SIZE;
double Factor = Matrix[index + firstEntry] / Matrix[RowIndex + firstEntry];
Matrix[index + firstEntry] = 0;
//ndrange_t range = ndrange_1D(firstEntry + 1, SIZE, 1);
//enqueue_kernel(get_default_queue(), CLK_ENQUEUE_FLAGS_NO_WAIT, range, ^{ReduceDenseRowForward(Matrix,Result, id, Row, Factor);});
for(int k = firstEntry + 1; k < SIZE; k++)
{
Matrix[index + k] -= Matrix[RowIndex + k] * Factor;
Result[id] -= Result[Row] * Factor;
}
}
Используя for для l oop, я получаю разумные данные, но когда я перехожу на enqueue_kernel
Возвращенная матрица заполняется значением "-6.27744e + 66" . Что-то мне не хватает?