我需要總結在CAFFE一個矩陣中的所有元素,如何使用cblas函數計算矢量中元素值的總和?
但正如我注意到,的cblas函數('math_functions.hpp'
& 'math_functions.cpp'
)的CAFFE包裝紙爲caffe_cpu_asum
,計算總和使用cblas_sasum
功能絕對值矢量中元素的值。
由於我是cblas的新手,我試圖找到一個合適的函數來擺脫絕對那裏,但似乎沒有在cblas中的那個屬性的函數。
有什麼建議嗎?
我需要總結在CAFFE一個矩陣中的所有元素,如何使用cblas函數計算矢量中元素值的總和?
但正如我注意到,的cblas函數('math_functions.hpp'
& 'math_functions.cpp'
)的CAFFE包裝紙爲caffe_cpu_asum
,計算總和使用cblas_sasum
功能絕對值矢量中元素的值。
由於我是cblas的新手,我試圖找到一個合適的函數來擺脫絕對那裏,但似乎沒有在cblas中的那個屬性的函數。
有什麼建議嗎?
有一種方法可以使用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兼容,一個需要分配一個Blob
爲mult_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);
數組的所有元素的求和足夠簡單,可以通過單個for循環來實現。您只需使用適當的編譯選項就可以使用SIMD指令進行矢量化。
對於caffe中的Blob,您可以使用.cpu_data()
來獲取數組的原始指針,然後使用for-loop。
感謝您的回放,實際上,許多cblas函數重做有效的操作太簡單了,但我必須在caffe中做,而不使用簡單的for循環來防止糟糕的性能。順便說一下,如何循環caffe中Blob的data_變量中的所有值? – Ali
for-loop在這方面有很好的表現。你可以使用適當的編譯選項來對其進行矢量化。 – kangshiyin
@Ali請看我的編輯。 – Shai
非常感謝。 – Ali