2016-08-01 5 views
0
私はカフェで行列のすべての要素を合計する必要

cblas関数を使用してベクトルの要素の値の合計を計算する方法は?

しかし、私は気づいたように、その和を計算caffe_cpu_asumとして、CBLAS関数('math_functions.hpp' & 'math_functions.cpp')のカフェラッパーはcblas_sasum関数を使用しています絶対ベクトルの要素の値。

私はcblasの初心者だから、絶対を取り除くのに適した関数を見つけようとしましたが、cblasにそのプロパティの関数がないようです。

提案がありますか?

答えて

2

cblas関数を使用する方法がありますが、これは少し面倒です。

「すべて1」のベクトルを定義し、このベクトルと行列の間にドット積をすると、結果が合計になります。

myBlobは、要素あなたは合計するカフェのブロブとしよう:

vector<Dtype> mult_data(myBlob.count(), Dtype(1)); 
Dtype sum = caffe_cpu_dot(myBlob.count(), &mult_data[0], myBlob.cpu_data()); 

このトリックはimplementation of "Reduction" layerに使用されています。


両方のGPU mult_dataなくstd::vectorためBlobを割り当てるに準拠し、1が必要(あなたはそれがpgu_data()だ必要があるため)この答えをするために:GPU用

vector<int> sum_mult_shape(1, diff_.count()); 
Blob<Dtype> sum_multiplier_(sum_mult_shape); 
const Dtype* mult_data = sum_multiplier_.cpu_data(); 
Dtype sum = caffe_cpu_dot(myBlob.count(), &mult_data[0], myBlob.cpu_data()); 

、(中'.cu'ソースファイル):

vector<int> sum_mult_shape(1, diff_.count()); 
Blob<Dtype> sum_multiplier_(sum_mult_shape); 
const Dtype* mult_data = sum_multiplier_.gpu_data(); 
Dtype sum; 
caffe_gpu_dot(myBlob.count(), &mult_data[0], myBlob.gpu_data(), &sum); 
+0

@Ali私の編集をご覧ください。 – Shai

+0

ありがとうございました。 – Ali

0

配列のすべての要素の合計は、単一のforループによって実装できるほど単純です。 SIMD命令でベクトル化するには、適切なコンパイルオプションを使用する必要があります。

blobがcaffeの場合、.cpu_data()を使用して、配列の生ポインタを取得してからfor-loopを使用できます。

+0

実際には、多くのcblasがあまりにも単純な操作を効率的にやっていますが、パフォーマンスの低下を防ぐために単純なforループを使用せずにcaffeで行う必要があります。ちなみに、CaffeのBlobのdata_変数のすべての値をどのようにループできますか? – Ali

+0

for-loopはこれに対して良好なパフォーマンスを示します。適切なコンパイルオプションを使用してベクトル化することができます。 – kangshiyin

関連する問題