2014-02-19 3 views
3

У меня есть пара структур, которые суммированы, превышают размер 256 байтов, разрешенный для передачи в качестве параметров в вызове ядра.Идеи для вызовов ядра CUDA с параметрами, превышающими 256 байтов

Обе структуры уже выделены и скопированы в глобальную память устройства.

1) Как я могу использовать в одном ядре этих структур без передачи в качестве параметров?

Подробнее. Отдельно эти структуры могут передаваться как параметры. Например, в разных ядрах. Но:

2) Как использовать обе структуры в одном ядре?

+7

Если структуры уже выделены и скопированы в глобальную память устройства, вы должны просто передать указатель на эти области. Не должно быть необходимости или причины передавать их по значению. –

+0

@RobertCrovella Спасибо. Я не был уверен, что могу указать на вызов ядра процессора и как я могу указать на эти области. У вычислительной способности 1.3 есть так много ограничений! – mrei

ответ

2

Как Роберт 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 *)&centMobj); 

Выше строк кода принадлежит принимающей стороне функции (mapper.c), который создает функцию ядра (mapper.cl) .. и следующие 4 строки (clSetKernelArg ..) передает аргументы функции ядра.

+0

Спасибо! Я понял. Я попытаюсь реализовать код CUDA и вернуться с большим количеством ресурсов и, вероятно, больше вопросов. – mrei

3

Если ваши структуры данных уже находятся в глобальной памяти, вы можете просто передать указатель в качестве аргумента ядра.

На соответствующую записку, предел для аргументов ядра является 4KB для устройств вычислительных возможностей 2.x и выше:

глобальных параметров функции передаются в устройство:

  • через общую память и ограничены 256 байтами на устройствах вычислительной возможности 1.x,
  • через постоянную память и ограничены 4 КБ на устройствах вычислительной способности 2.x и выше.

устройство и глобальные функции не могут иметь переменное число аргументов.

(c.f. http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#function-parameters)

+0

Спасибо. Я прочитал эту часть документации. На данный момент я связан с вычислительной способностью 1.3 (Tesla C1060). Надеюсь, скоро будет обновление (надеюсь, прежде чем закончить диссертацию). – mrei

Смежные вопросы