Как вычислить сумму значений элементов в векторе, используя функции cblas?

Мне нужно сложить все элементы матрицы в кофе,

Но, как я заметил, оболочка caffe для функций cblas ('math_functions.hpp' & 'math_functions.cpp') использует cblas_sasum функционировать как caffe_cpu_asum который вычисляет сумму абсолютных значений элементов в векторе.

Поскольку я новичок в 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() );

Этот трюк используется при реализации "Reduction" слой.


Чтобы сделать этот ответ совместимым с двумя графическими процессорами, необходимо выделить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() );

Для графического процессора, (в '.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.

Для Blob в кафе, вы можете использовать .cpu_data() чтобы получить необработанный указатель массива, а затем использовать цикл for.

Другие вопросы по тегам