2016-05-20 10 views
9

私はこのclang referenceに従ってclangで以下の関数をベクトル化しようとしています。バイト配列のベクトルをとり、this RFCに従ってマスクを適用します。clangの関数をベクトル化する

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

次のフラグが打ち鳴らすために渡されます。

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

私はループのためにこれをベクトル化するにはどうすればよいですか?

+0

あなたはループの外ベクトルの大きさをキャプチャし、ループ条件のためにそれを使用した場合はどうなりますか? – NathanOliver

+0

すでに試しました。助けにならない! – rahul

+1

このループは、ベクトル化するのが簡単です。コンパイラが明示的に '-03'を暗黙的に実行するかどうかチェックしましたか? –

答えて

4

@PaulRと@PeterCordesのおかげです。ループのアンロールは4分の1になります。

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

+1

実際には[Paulの考え](https://stackoverflow.com/questions/37351236/vectorize-a-function-in-clang#comment62218869_37351236)でした。 :) –

+2

展開をベクトル化する唯一の方法は、gcc.godboltのすべてのコンパイラを試しましたが、展開することなく誰もベクトル化できませんでした。 – GameDeveloper

+1

@BaummitAugenこれを指摘してくれてありがとう。一定。 – rahul

関連する問題