2017-01-16 35 views
6

私はテンプレートクラスの引数として__m256を使用しています(下記のコードを参照)。 Ubuntuの16.10でG ++バージョン6.2でコンパイルすると、それは属性がテンプレート引数に無視さについて私に警告します:gcc警告:テンプレート引数の属性を無視する(-Wignored-attributes)

warning: ignoring attributes on template argument ‘__m256 {aka __vector(8) float}’ [-Wignored-attributes] typedef vec_array<__m256> vec256 

__m256タイプはアライメントに関するいくつかの属性持っているようだ(そしておそらくいくつかの他の?)。以下に示すこのプリミティブコンテナクラスの唯一の目的は、これらの特別なインテル変数(__m256、__m128など)のヒープ上でのメモリアライメントを処理することです。

私は全体のプログラムでこのコンテナクラスを使用すると、正常に動作しているようです。しかし、私の質問は、gccがこれらの属性を無視しているときの意味です(gccのマニュアルで問題点をすでに読んでいます)。

  1. 誰もこれらの警告を取り除く良い方法がありますか?
  2. これについて心配する必要はありますか?
  3. この警告を無視した場合に起こりうる最悪のことは何ですか?

参考として、以下のコードでこの警告が表示されます。

この件に関するお手伝いやご意見は大変ありがとうございます。ありがとうございます。

/////////////////////////////////////////////////////////////////////////////// 
// System includes: 

#include <x86intrin.h> 
#include <cstdint> 

static const size_t AVX_alignment = 32; 

template<typename VecT> 
class vec_array 
{ 
protected: 
    VecT* m_pdata; 
    size_t m_num_vector_elements; 

public: 
    vec_array(); 
    vec_array(size_t num_vector_elements); 

    virtual ~vec_array(); 

    void allocate(size_t num_vector_elements); 
    void free(); 

}; 

template<typename VecT> 
vec_array<VecT>::vec_array() : m_pdata(nullptr), m_num_vector_elements(0) 
{} 

template<typename VecT> 
vec_array<VecT>::vec_array(size_t num_vector_elements) : m_pdata(nullptr), 
m_num_vector_elements(num_vector_elements) 
{ 
    allocate(num_vector_elements); 
} 

template<typename VecT> 
vec_array<VecT>::~vec_array() 
{ 
    free(); 
} 

template<typename VecT> 
void vec_array<VecT>::allocate(size_t num_vector_elements) 
{ 
    if(m_num_vector_elements == num_vector_elements) 
     return; 

    m_num_vector_elements = num_vector_elements; 

    free(); 

    m_pdata = reinterpret_cast<VecT*>(_mm_malloc(m_num_vector_elements*sizeof(VecT), AVX_alignment)); 
} 

template<typename VecT> 
void vec_array<VecT>::free() 
{ 
    if(m_pdata != nullptr) 
     _mm_free(m_pdata); 
} 


typedef vec_array<__m256> vec256; 

int main() 
{ 
    vec256 test_vec(10); 

} 

答えて

0

私は同じ警告を出しましたが、いくつかのopenclコードで、コードを最初に見ずにここに入りました。どのように人々がこの警告を回避しようとするかを見ることができますMaking std::vector allocate aligned memoryしかし、私の意見では、それはちょうどそれの価値はありません。

短い答えは、128ビットのAVX命令だけをサポートするCPUを除いて、これについて心配する必要はないということです。警告が深刻な場合、CPUはアラインされていないアクセスに関する例外を生成します。

この警告は、__m256型がおそらく16バイトのアライメント指定子で宣言されている可能性があるためです。つまり、CPUは、ベクトルの各要素のアライメントが16バイトであると予想します。ただし、vectorのテンプレートはalignment属性を使用しません。

私はあなたがエラーを引き起こすコードを生成するコンパイラを強制的に

struct stupidStruct __attribute__(packed) { 
    unsigned short padding; 
    std::vector<__m256> vect; 
}; 

のように、愚かな何かをしなければならないと思います。

関連する問題