Перебор связанного списка в ядре OpenCL (svmpointer) - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы передать связанный список в ядро ​​OpenCL и выполнить итерацию по списку для выполнения операций со значениями каждого элемента. Я выделяю каждый элемент с clSVMAlloc в общей виртуальной памяти. Документы Intel предполагают, что это вполне возможно, хотя я не могу найти подходящего объяснения относительно того, как на самом деле выполнить цикл.

//real is of type cl_double
typedef cl_double real;
typedef cl_double2 real2;

typedef struct
{

     //  Mass
    real m;
    //  Position
    real2 x;
    //  Velocity
    real2 v;
    //  Force
    real2 F;
    //  Force_old
    real2 F_old;
    //  Bodytype
    cl_char body;

} Particle;

//  Datastructure of linked list
typedef struct ParticleList
{

    Particle p;
    struct ParticleList *next;
} ParticleList;

Это функция ядра (структуры также определены в файле .cl)

__kernel void test(
__global ParticleList *pList){

 //  Check if pList->next is NULL
if(pList->next != NULL){

    while(pList->next != NULL){

        pList->p.body = 'Z';
        pList = pList->next;
   }
 }

Я установил аргумент ядра с помощью

clSetKernelArgSVMPointer(kernel[0], 0, grid[0]));

(сетка - это массив списков, а не массив заголовков списков)

При вызове ядра с

clEnqueueNDRangeKernel(cmd_queue, kernel[0], 1, NULL, &global_work_size, 
NULL, 0, NULL, NULL)

это касается только первого элемента списка.

Кто-нибудь получил представление о том, как получить доступ к * следующему указателю каждого списка?

...