免责声明:本文作者对 C++ 和 Python 的了解有限,对 Java 和 Ruby 有足够的了解。
“OpenCL 编程指南”一书中的一个示例使用以下 OpenCL 自定义图形数据结构,以便 Dijkstra 算法在 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;
}
}
此数据结构基于 Pawan Harish 和 PJ Narayanan 撰写的“使用 CUDA 在 GPU 上加速大型图形算法”一文中的示例。
基本上,它有三个数组:一个顶点数组V
,每个顶点指向它在边数组中的相邻顶点E
(一个顶点i+1
的相邻顶点i
紧跟在数组中的该顶点的相邻顶点E
)。第三个数组用于边缘权重(还有两个更具体的 OpenCL 相关数组)。
如何在 Python/Numpy 中表示这个数据结构?我想在 PyOpenCL 中使用它。