Отказ от ответственности: автор этого поста имеет ограниченные знания C ++ и Python и обладает достаточными знаниями Java и Ruby.
Пример из книги "Руководство по программированию OpenCL"использует следующую настроенную OpenCL графическую структуру данных для алгоритма Дейкстры для запуска на устройстве OpenCL:
void generateRandomGraph(GraphData *graph, int numVertices, int neighborsPerVertex)
{
graph->vertexCount = numVertices;
graph->vertexArray = (int*) malloc(graph->vertexCount * sizeof(int));
graph->edgeCount = numVertices * neighborsPerVertex;
graph->edgeArray = (int*)malloc(graph->edgeCount * sizeof(int));
graph->weightArray = (float*)malloc(graph->edgeCount * sizeof(float));
for(int i = 0; i < graph->vertexCount; i++)
{
graph->vertexArray[i] = i * neighborsPerVertex;
}
for(int i = 0; i < graph->edgeCount; i++)
{
graph->edgeArray[i] = (rand() % graph->vertexCount);
graph->weightArray[i] = (float)(rand() % 1000) / 1000.0f;
}
}
Эта структура данных основана на примере из статьи «Ускорение алгоритмов больших графов на GPU с использованием CUDA»Pawan Harish и PJ Narayanan.
По сути, у него есть три массива: массив вершин V
, каждая вершина которого указывает на свои соседние вершины в массиве ребер E
(соседи вершины i+1
следуйте за соседями вершины i
непосредственно в массиве E
).Третий массив предназначен для весов ребер (есть еще два конкретных связанных с OpenCL массива).
Как я могу представить эту структуру данных в Python / Numpy? Я хотел бы использовать ее в PyOpenCL.