2016-08-01 33 views
0

ich alle Elemente einer Matrix in Caffe,Wie berechnet man die Summe der Werte von Elementen in einem Vektor mit Hilfe von cblas-Funktionen?

Aber wie schon bemerkt, die caffe Umhüllung der cblas Funktionen ('math_functions.hpp' & 'math_functions.cpp') cblas_sasum Funktion wird unter Verwendung von summieren müssen als caffe_cpu_asum dass die Summe berechnet der absolute Werte von Elementen in einem Vektor.

Da ich ein Neuling in cblas bin, habe ich versucht, eine geeignete Funktion zu finden, absolute dort loszuwerden, aber es scheint, dass es keine Funktion mit dieser Eigenschaft in cblas gibt.

Irgendwelche Vorschläge?

Antwort

2

Es gibt einen Weg, dies mit cblas Funktionen zu tun, obwohl es ein bisschen eine peinliche Art und Weise ist.

Was Sie tun müssen, ist einen "alle 1" Vektor zu definieren, und dann ein Skalarprodukt zwischen diesem Vektor und Ihrer Matrix, das Ergebnis ist die Summe.

Let myBlob ein caffe Blob, deren Elemente, die Sie summieren möchten:

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

Dieser Trick im implementation of "Reduction" layer verwendet wird.


Um diese Antwort zu machen beide kompatible GPU, ein Bedarf ein Blob für mult_data zuteilen und keine std::vector (weil Sie es pgu_data() benötigen):

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

Für GPU (die in einem '.cu' Quelldatei):

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 siehe meine Bearbeitung. – Shai

+0

Vielen Dank. – Ali

0

Die Summe aller Elemente eines Arrays ist einfach genug, um von einer einzigen For-Schleife implementiert zu werden. Sie müssen nur die richtigen Kompilierungsoptionen verwenden, um sie mit SIMD-Anweisungen zu vektorisieren.

Für Blob in Caffe könnten Sie .cpu_data() verwenden, um den rohen Zeiger des Arrays zu erhalten, und dann for-loop verwenden.

+0

Danke für Ihre Wiederholung, tatsächlich, viele cblas Funktionen a Re zu tun zu einfach Operationen effizient, aber ich muss es in Caffe tun, ohne eine einfache for-Schleife zu verwenden, um schlechte Leistung zu verhindern. Übrigens, wie kann ich alle Werte in der Variable data_ eines Blobs in caffe durchlaufen? – Ali

+0

for-Schleife hat eine gute Leistung auf diesem. Sie können korrekte Kompilierungsoptionen verwenden, um sie zu vektorisieren. – kangshiyin