タイトルのとおりなのですが、再帰関数をCUDAを使って高速化するというのは可能なのでしょうか?
例えば、配列の各要素に対してある操作をするというのはCUDAを使うことで並列に処理できて高速化が実現されるというのはよくみます。再帰関数の場合には、処理をどう各スレッドに分ければ良いのかわかりませんでした。
試しにフィボナッチ数列のn番目の数字を求めるコードを書いてみました。
cuda
1#include <stdio.h> 2 3__device__ void fib_cuda(int n, int *out) { 4 if (n < 3) { 5 *out = 1; 6 } else { 7 int *p, *pp; 8 p = (int*)malloc(sizeof(int)); 9 pp = (int*)malloc(sizeof(int)); 10 11 fib_cuda(n - 1, p); 12 fib_cuda(n - 2, pp); 13 14 *out = *p + *pp; 15 free(p); 16 free(pp); 17 } 18} 19 20__global__ void fib(int n, int *out) { 21 fib_cuda(n, out); 22} 23 24int main() { 25 int *out; 26 int *d_out; 27 out = (int*)malloc(sizeof(int)); 28 29 cudaMalloc((void**)&d_out, sizeof(int)); 30 cudaMemcpy(d_out, out, sizeof(int), cudaMemcpyHostToDevice); 31 32 fib<<<1, 1>>>(20, d_out); 33 cudaMemcpy(out, d_out, sizeof(int), cudaMemcpyDeviceToHost); 34 printf("%d\n", *out); 35 36 cudaFree(d_out); 37 free(out); 38} 39
このコードは動きはするのですが、単にGPU上でCPUと同じ処理をしただけでGPUの恩恵は皆無です。もし再帰関数の高速化も可能ならば上のコードはどう書かれるべきなのでしょうか?
抽象的な質問で申し訳ないのですがよろしくおねがいします。
回答2件
あなたの回答
tips
プレビュー