2016-08-01 28 views
0

我需要總結在CAFFE一個矩陣中的所有元素,如何使用cblas函數計算矢量中元素值的總和?

但正如我注意到,的cblas函數('math_functions.hpp' & 'math_functions.cpp')的CAFFE包裝紙爲caffe_cpu_asum,計算總和使用cblas_sasum功能絕對值矢量中元素的值。

由於我是cblas的新手,我試圖找到一個合適的函數來擺脫絕對那裏,但似乎沒有在cblas中的那個屬性的函數。

有什麼建議嗎?

回答

2

有一種方法可以使用cblas函數,儘管它有點尷尬。

你需要做的是定義一個「全1」向量,然後在這個向量和矩陣之間做一個點積,結果就是總和。

myBlob是朱古力的Blob要總結其元素:

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兼容,一個需要分配一個Blobmult_data而不是std::vector(因爲你需要它的pgu_data()):

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()); 

對於GPU,(在'.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指令進行矢量化。

對於caffe中的Blob,您可以使用.cpu_data()來獲取數組的原始指針,然後使用for-loop。

+0

感謝您的回放,實際上,許多cblas函數重做有效的操作太簡單了,但我必須在caffe中做,而不使用簡單的for循環來防止糟糕的性能。順便說一下,如何循環caffe中Blob的data_變量中的所有值? – Ali

+0

for-loop在這方面有很好的表現。你可以使用適當的編譯選項來對其進行矢量化。 – kangshiyin

相關問題