Как Роберт Crovella предложил в своем комментарии, вы должны просто быть в состоянии передать указатель на эти области. я имел подобную проблему в OpenCL .. Это, как я реализовал:-структуру (.! Мои ядра и хост-функции в OpenCL, синтаксис может быть проблемой для you..but контекст же)
После двух определяются в моем «Mapper.c» -> функции хоста
typedef struct data
{
double dattr[10];
int d_id;
int bestCent;
}Data;
typedef struct cent
{
double cattr[5];
int c_id;
}Cent;
Data *dataNode;
Cent *centNode;
После выделения памяти на глобальной памяти устройства, я передал данные. мне пришлось пересмотреть определение структуры в моей другой функции ядра, как показано ниже:
mapper.cl:
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
typedef struct data
{
double dattr[10];
int d_id;
int bestCent;
}Data;
typedef struct cent
{
double cattr[5];
int c_id;
}Cent;
__kernel void mapper(__global int *keyMobj, __global int *valueMobj,__global Data *dataMobj,__global Cent *centMobj)
{
int i= get_global_id(0);
int j,k,color=0;
double dmin=1000000.0, dx;
for(j=0; j<2; j++) //here 2 is number of centroids considered
{
dx = 0.0;
for(k=0; k<2; k++)
{
dx+= ((centMobj[j].cattr[k])-(dataMobj[i].dattr[k])) * ((centMobj[j].cattr[k])-(dataMobj[i].dattr[k]));
}
if(dx<dmin)
{ color = j;
dmin = dx;
}
}
keyMobj[i] = color;
valueMobj[i] = dataMobj[i].d_id;
}
Вы можете видеть, что я прошел только указатель на ту область .. т.е. keyMobj и valueMobj.
kernel = clCreateKernel(program, "mapper", &ret);
ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&keyMobj);
ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&valueMobj);
ret = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&dataMobj);
ret = clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *)¢Mobj);
Выше строк кода принадлежит принимающей стороне функции (mapper.c), который создает функцию ядра (mapper.cl) .. и следующие 4 строки (clSetKernelArg ..) передает аргументы функции ядра.
Если структуры уже выделены и скопированы в глобальную память устройства, вы должны просто передать указатель на эти области. Не должно быть необходимости или причины передавать их по значению. –
@RobertCrovella Спасибо. Я не был уверен, что могу указать на вызов ядра процессора и как я могу указать на эти области. У вычислительной способности 1.3 есть так много ограничений! – mrei