2017-01-16 1402 views
6

我正在使用__m256作爲模板類的參數(請參閱下面的代碼)。當相剋在Ubuntu 16.10編譯++ 6.2版本,它提醒我關於屬性的模板參數被忽略:gcc警告的含義:忽略模板參數上的屬性(-Wignored-attributes)

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

的__m256類型似乎有關於對準一些屬性(也許其它的嗎?)。下面顯示的這個基本容器類的唯一目的(並生成警告)是處理這些特殊Intel變量(__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個字節。但是,矢量的模板不符合對齊屬性。

我認爲你必須做一些愚蠢的事,就像一個

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

強制編譯器產生的代碼,會導致錯誤。