#include <cmath>
#include <iostream>
#include "xsimd/xsimd.hpp"
namespace xs = xsimd;
void ListLog10(float* a, float* result, int size) {
using batch_type = xs::batch<float, xs::default_arch>; // 自动选择最优指令集架构
constexpr std::size_t batch_size = batch_type::size;
// 向量化处理主循环
std::size_t vec_size = size - (size % batch_size);
std::cout << "vec_size=" << vec_size << std::endl;
std::cout << "batch_size=" << batch_size << std::endl;
for (std::size_t i = 0; i < vec_size; i += batch_size) {
std::cout << "i=" << i << std::endl;
auto a_vec = batch_type::load_unaligned(a + i); // 加载未对齐数据
auto log_vec = xs::log10(a_vec); // SIMD对数计算
// auto log_vec = a_vec * 2;
log_vec.store_unaligned(result + i); // 存储结果
std::cout << a_vec << std::endl;
std::cout << log_vec << std::endl;
}
// 处理剩余元素
for (std::size_t i = vec_size; i < size; ++i) {
result[i] = std::log10(a[i]);
}
}
int main() {
std::vector<float> a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<float> result(a.size());
ListLog10(a.data(), result.data(), a.size());
for (int i = 0; i < a.size(); i++) {
std::cout << result[i] << " ";
}
std::cout << std::endl;
return 0;
}
This is my code. I found that using arithmetic operations or other trigonometric functions works fine, but using the log function specifically returns 0 when I use O2 option.
The default architecture is neon64, and supported_architectures returns neon64 and neon. I get the same result when switching to neon.
This is my code. I found that using arithmetic operations or other trigonometric functions works fine, but using the log function specifically returns 0 when I use O2 option.
The default architecture is neon64, and supported_architectures returns neon64 and neon. I get the same result when switching to neon.