Ядро OpenCL дает неверные результаты, когда я использую частные аргументы - PullRequest
0 голосов
/ 16 мая 2019

Когда я передаю скалярные значения в качестве аргументов ядра, OpenCl дает неверные результаты.Но когда я жестко кодирую значения внутри ядра, он работает идеально.Я думаю, что сделал ошибку в коде ядра.Пожалуйста, помогите.

Я попытался передать аргументы как глобальные и создал приватные переменные из глобальных аргументов.

//Kernel code
__kernel void my_add(__global float3* A,
                     __global float3* B,
                     __global float3* C,
                     __global float3* D,
                     float fsx,
                     float fsy,
                     float fsz, 
                     float fXfactor, 
                     float fYfactor,
                     float fZfactor){
    #define FLT_MAX 3.402823466e+38F
    size_t gid = get_global_id(0);
    float3 fs = (float3)(fsx,fsy,fsz); //Works when hardcoded fs = (1,1,1); 
    float3 ffactor = (float3)(fXfactor,fYfactor,fZfactor); //Works hardcoded
    if(A[gid].x!=FLT_MAX && 
       A[gid].y!=FLT_MAX && 
       A[gid].z!=FLT_MAX && 
       B[gid].x!=FLT_MAX && 
       B[gid].y!=FLT_MAX && 
       B[gid].z!=FLT_MAX)
       {
        D[gid] = C[gid]+(fs*(A[gid]+ffactor* 
        (B[gid]-A[gid])));
        }
};

//Passing args from host
my_add.setArg(0, bufferA);//cl::buffer float array 
my_add.setArg(1, bufferB);//cl::buffer float array 
my_add.setArg(2, bufferC);//cl::buffer float array 
my_add.setArg(3, bufferD);//cl::buffer float array 
my_add.setArg(4, fSx); // float variable declared in host
my_add.setArg(5, fSy); // float variable declared in host
my_add.setArg(6, fSz); // float variable declared in host
my_add.setArg(7, fXFactor); // float variable declared in host
my_add.setArg(8, fYFactor); // float variable declared in host
my_add.setArg(9, fZFactor); // float variable declared in host

//Input Buffer values
bufferA = 5.5,5.5......n
bufferB = 10.5,10.5,10.5....n
bufferC = 1,2,3,1,2,3,1,2,3....n
bufferD = null; size = n
fSx=fSy=fSz=fXFactor=fYFactor=fZFactor=1

Ожидается: 11.5,12.5,13.5,11.5,12.5,13.5, ....... n

Фактически: 11,5,12,5,13,5, 0,12,5,13,5, 11,5,0,13,5, 11,5,12,5,0, 11,5,12,5,13,5, 0,12,5,13,5, 11,5,0,13,5, 11,5,12,5,0, ....... n

1 Ответ

0 голосов
/ 23 мая 2019

Все аргументы ядра должны быть квалификаторами __global, __local или __constant.Вы можете либо жестко кодировать константы непосредственно там, где они вам нужны, либо запекать их в кодовую строку OpenCL с помощью

"\r\n #define fsx " + to_string(some_float_number) + "f \r\n"

или объявлять их как __constant значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...