Когда я передаю скалярные значения в качестве аргументов ядра, 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