visual studio microsoft español descargar community c++ vector simd clang++

c++ - microsoft - visual studio installer



Vectorizar una función en clang (1)

Estoy tratando de vectorizar la siguiente función con clang de acuerdo con esta referencia clang . Toma un vector de matriz de bytes y aplica una máscara de acuerdo con este 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]; } }

Los siguientes indicadores se pasan a clang:

-O3 -Rpass=loop-vectorize -Rpass-analysis=loop-vectorize

Sin embargo, la vectorización falla con el siguiente error:

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]

¿Cómo vectorizo ​​esto para el ciclo?


Gracias a @PaulR y @PeterCordes. Desenrollando el ciclo por un factor de 4 funciona.

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]; } }

código gcc.godbolt