Я хотел бы передать связанный список в ядро 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)
это касается только первого элемента списка.
Кто-нибудь получил представление о том, как получить доступ к * следующему указателю каждого списка?