Как использовать на стороне устройства постановку в очередь, чтобы не получить данные для мусора - PullRequest
0 голосов
/ 27 февраля 2020

В качестве упражнения по использованию 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" . Что-то мне не хватает?

...