передача массива структур в ядро ​​в открытом CL - PullRequest
3 голосов
/ 16 декабря 2011

Привет, я пытаюсь реализовать программу векторного расстояния в открытом CL ..

В основном у меня проблемы с передачей массива структур в ядро ​​в качестве аргумента ..

моя структура определена следующим образом:

    typedef struct 
    {
    int a[nodes][4];
    }node;
    node * srcA;

после выделения памяти для этого .. Я связал его в буферный объект, используя этот код

         // allocate the buffer memory objects
    memobjs1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,           
         sizeof(node) * n, srcA, NULL);

if (memobjs1 == (cl_mem)0)
{
    printf("ERROR: Failed to create Buffer...mem[0]\n");
    clReleaseCommandQueue(cmd_queue);
    clReleaseContext(context);
    return -1;
}

, и мой аргумент ядра установлен какэто

    err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &memobjs1);

теперь я хочу передать этот массив структур (т.е. указываемых srcA) в ядро, я сделал это ..

    const char *ocl_test_programs[] = {\
              "__kernel void disvec (__global node *x,__global int *p)"\
          "{"\
         "int i=1,r=1,n;"\
          "r=p[1]; "\
          "n=p[0];"\

          //"for(i=1;i<=n;i++) "\

         "{"\

          "if(x[r].a[i][2]!=999 && x[r].a[i][2]!=0)"\

         "{"\

      "int j = get_global_id(0); "\

        /*  "int k=x[r].a[i][2] + x[i].a[j][2];"\
            "if(x[r].a[j][2]>k)"\
        "{ "\

            "   x[r].a[j][2] = k;"\
            "x[r].a[j][3] = i; } "\   */
        //" } "\  

     " } "\
    " } "\
    " } "
    };

когда я запускаю эту программу, она говориттип узла не определен ... я должен иметь в виду некоторые другие параметры для передачи ??Какие изменения я должен сделать .. ??если кто-то может хотя бы дать мне простой код, чтобы проиллюстрировать передачу структуры в ядро ​​на простом примере, это будет высоко оценено ... большое спасибо :)

1 Ответ

10 голосов
/ 16 декабря 2011

Вам также необходимо указать определение структуры в ядре.Компилятор, который компилирует ваше ядро, волшебным образом не знает о типах, определенных в вашем C-коде.Это становится более очевидным, когда вы держите свое ядро ​​в отдельном файле, а не в виде гигантской строки в своей «основной» программе.

Ваш исходный код ядра будет выглядеть так:

typedef struct {
    int a[nodes][4];
} node;

kernel void disvec (global node *x, global int *p) {
    /* you kernel code here */
};
...