在 clon 中对函数进行矢量化
Vectorize a function in clang
我正在尝试根据此 clang 引用使用 clang 矢量化以下函数。它采用字节数组的向量并根据此 RFC 应用掩码。
static void apply_mask(vector<uint8_t> &payload, uint8_t (&masking_key)[4]) {
#pragma clang loop vectorize(enable) interleave(enable)
for (size_t i = 0; i < payload.size(); i++) {
payload[i] = payload[i] ^ masking_key[i % 4];
}
}
以下标志将传递给 clang:
-O3
-Rpass=loop-vectorize
-Rpass-analysis=loop-vectorize
但是,矢量化失败,并显示以下错误:
WebSocket.cpp:5:
WebSocket.h:14:
In file included from boost/asio/io_service.hpp:767:
In file included from boost/asio/impl/io_service.hpp:19:
In file included from boost/asio/detail/service_registry.hpp:143:
In file included from boost/asio/detail/impl/service_registry.ipp:19:
c++/v1/vector:1498:18: remark: loop not vectorized: could not determine number
of loop iterations [-Rpass-analysis]
return this->__begin_[__n];
^
c++/v1/vector:1498:18: error: loop not vectorized: failed explicitly specified
loop vectorization [-Werror,-Wpass-failed]
如何对此进行矢量化循环?
感谢@PaulR和@PeterCordes。将循环展开 4 倍工作。
void apply_mask(vector<uint8_t> &payload, const uint8_t (&masking_key)[4]) {
const size_t size = payload.size();
const size_t size4 = size / 4;
size_t i = 0;
uint8_t *p = &payload[0];
uint32_t *p32 = reinterpret_cast<uint32_t *>(p);
const uint32_t m = *reinterpret_cast<const uint32_t *>(&masking_key[0]);
#pragma clang loop vectorize(enable) interleave(enable)
for (i = 0; i < size4; i++) {
p32[i] = p32[i] ^ m;
}
for (i = (size4*4); i < size; i++) {
p[i] = p[i] ^ masking_key[i % 4];
}
}
gcc.godbolt code
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 声明默认的模板化函数
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- GCC 4.8.2 自动矢量化由于 cout 而失败
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- RcppEigen 模板化函数,用于填充单位法线
- 特征模板化函数和维度
- 在模板化函数中重新定义(忽略)的 SWIG 标识符
- 跨模板化函数编译的静态变量
- 推断模板化函数中的函数重载
- 为什么浮点数的矢量化比双精度更有效?
- 模板化函数或具有指向基类的指针的函数
- 我可以期望某些 STL 函数实现是可自动矢量化的吗?
- 如何将现有的矢量化函数与Intel编译器自动化的现有标量函数相关
- 为什么 GCC 不能矢量化这个函数和循环
- 如何将POW函数矢量化(具有负碱基)
- 犰狳中的矢量化功率函数
- 使用内部函数矢量化矩阵乘法的加法部分
- 在 C++ 的矢量 resize() 函数中随机化构造函数参数
- 为什么这个自动矢量化器关心构造函数/析构函数