免責事項: この投稿の著者は、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;
}
}
このデータ構造は、Pawan Harish と PJ Narayanan による論文「CUDA を使用した GPU での大規模なグラフ アルゴリズムの高速化」の例に基づいています。
基本的に、これには 3 つの配列があります。V
各頂点がエッジ配列内の隣接頂点を指す頂点配列E
(頂点の隣接は、配列内の頂点の隣接の直後にi+1
続きます)。3 番目の配列はエッジ ウェイト用です (さらに 2 つの特定の OpenCL 関連の配列があります)。i
E
このデータ構造を Python/Numpy で表現するにはどうすればよいですか? PyOpenCL で使用したいと思います。