3

Matlab で関数f ( x ) = exp(- x ) を計算しています。xはスカラーのベクトルです。関数は GPU で計算されます。

x_cpu = [4 5 11 1];
x = gpuArray(x_cpu);
f = exp(-x);

結果は次のようになります。

f = exp(-[4, 5, 11, 1]) = [0.183, 0.0067, 1.6702e-005, 0.3679].

f ( x (3)) = f (11) = exp(-11) = 1.6702e-005 = 0.000016702 であることに注意してください。これはかなり小さい値です。したがって、単純にf ( x (i)) = 0を設定して、すべてのx (i) > 10の関数を計算することは避けたいと思います。

xにはおそらく疎行列表現を使用できます。ただし、Parallel Computing Toolbox は、GPU 上のスパース行列に対する操作をサポートしていません。

これにどのようにアプローチしますか?

4

2 に答える 2

1

注: このアプローチは、質問のステートメントに対処するための回避策です。

したがって、単に f(x(i)) = 0 を設定するだけで、すべての x(i) > 10 の関数を計算することは避けたいと思います。

これは決して真に「まばらな」数値法ではありません。これは単に、MATLAB の GPU で「すべての x(i) > 10 の関数を計算することを避ける」ための手段です。

% original input vector
x_cpu = [4 5 10 1 13 8 9]; 

% logical indeces of x where exp(-x) is significant
ix = x_cpu <= 10;

% values of x where exp(-x) is significant ("sparse" x)
x_sp = x_cpu(ix);

% Load our "sparse" vector to GPU
x_gpu = gpuArray(x_sp);

% create a vector of zeros for function output on GPU
f_gpu = parallel.gpu.GPUArray.zeros(size(x_cpu)); 

% do the calculations only for the "sparse" matrix on the GPU
f_gpu(ix) = exp(-x_gpu);    

計算をワークスペースに戻したい場合は、gatherを使用します。

f_cpu = gather(f_gpu);         % GPU --> workspace

注: このコードはテストしていません

メモリを節約し、プロセスを高速化するために、これらの初期化 (x_spまたは、おそらく)のいくつかを組み合わせる必要があります。ix正直なところ、ワークスペースと GPU 間の初期化とデータ転送により、実際にはこのプロセス全体が以前よりも遅くなる可能性があります。やってみるしかない!

于 2012-05-30T17:59:23.930 に答える
1

Parallel Computing Toolbox は GPU での疎行列演算をサポートしていませんが、Jacket はサポートしています。したがって、考えられるアプローチの 1 つは、単純に別のツールを使用することです。

免責事項は、私が Jacket に取り組んでいるということですが、これはあなたがやりたいことをサポートし、PCT ができないことをサポートしているため、これについては本当に有益だと思います。理由はここにあります。

于 2012-06-22T15:04:32.357 に答える