Как вычислить сумму значений элементов в векторе, используя функции 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.