如何使用 cblas 函数计算向量中元素值的总和?
How to compute the sum of the values of elements in a vector using cblas functions?
我需要在caffe中对一个矩阵的所有元素求和,
但正如我所注意到的,cblas 函数 ('math_functions.hpp'
& 'math_functions.cpp'
) 的 caffe 包装器正在使用 cblas_sasum
函数作为 caffe_cpu_asum
计算向量中元素的 绝对 值之和。
由于我是cblas的新手,我试图找到一个合适的函数来摆脱那里的absolute,但似乎没有那个属性 在 cblas.
有什么建议吗?
数组所有元素的求和非常简单,只需一个 for 循环即可实现。您只需要使用适当的编译选项通过 SIMD 指令对其进行矢量化。
对于caffe中的Blob,你可以使用.cpu_data()
获取数组的原始指针,然后使用for循环。
有一种方法可以使用 cblas 函数来实现,尽管这种方法有点笨拙。
你需要做的是定义一个"all 1"向量,然后在这个向量和你的矩阵之间做点积,结果就是总和。
设 myBlob
为要对其元素求和的 caffe 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,需要为 mult_data
而不是 std::vector
分配 Blob
(因为你需要 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 );
我需要在caffe中对一个矩阵的所有元素求和,
但正如我所注意到的,cblas 函数 ('math_functions.hpp'
& 'math_functions.cpp'
) 的 caffe 包装器正在使用 cblas_sasum
函数作为 caffe_cpu_asum
计算向量中元素的 绝对 值之和。
由于我是cblas的新手,我试图找到一个合适的函数来摆脱那里的absolute,但似乎没有那个属性 在 cblas.
有什么建议吗?
数组所有元素的求和非常简单,只需一个 for 循环即可实现。您只需要使用适当的编译选项通过 SIMD 指令对其进行矢量化。
对于caffe中的Blob,你可以使用.cpu_data()
获取数组的原始指针,然后使用for循环。
有一种方法可以使用 cblas 函数来实现,尽管这种方法有点笨拙。
你需要做的是定义一个"all 1"向量,然后在这个向量和你的矩阵之间做点积,结果就是总和。
设 myBlob
为要对其元素求和的 caffe 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,需要为 mult_data
而不是 std::vector
分配 Blob
(因为你需要 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 );