GCC警告的含义:忽略模板参数上的属性(-Wignored属性)

Implication of GCC warning: ignoring attributes on template argument (-Wignored-attributes)

本文关键字:属性 参数 -Wignored 警告 GCC      更新时间:2023-10-16

我使用__m256作为模板类的参数(请参阅下面的代码)。在Ubuntu上使用g++6.2版进行编译时;16.10(Yakkey Yak),它警告我模板参数中的属性被忽略:

警告:忽略模板参数"__m256{aka __vector(8)float}"[-Wignored attributes]typedef vec_array&lt__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);
}

我在一些OpenCL代码中遇到了同样的警告,并在这里结束了,没有先看代码。你可以在制作std::vector分配对齐内存中看到一些人试图避免这个警告,但在我看来这是不值得的。

简单的答案是,除了只支持128位AVX指令的CPU之外,您不必担心这一点。如果警告是严重的,那么CPU将在未对齐的访问上生成异常。

出现此警告的原因是,类型__m256可能是用可能为16字节的对齐说明符声明的。也就是说,CPU将期望向量的每个元素的对齐为16字节。但是,矢量的模板不支持对齐属性。

我认为你必须做一些愚蠢的事情,比如

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

以强制编译器生成会导致错误的代码。

可以通过使用以下结构包装向量类型(如__m256)来消除这些警告:

struct __m256_wrapper {
typedef __m256 VecT;
};

并在需要的地方使用该结构作为模板参数。因此,您提供的代码将更改如下:

///////////////////////////////////////////////////////////////////////////////
// System includes:
#include <x86intrin.h>
#include <cstdint>
static const size_t AVX_alignment = 32;
struct __m256_wrapper {
typedef __m256 VecT;
};
template<typename W>
class vec_array
{
protected:
typename W::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 W>
vec_array<W>::vec_array() : m_pdata(nullptr), m_num_vector_elements(0)
{}
template<typename W>
vec_array<W>::vec_array(size_t num_vector_elements) : m_pdata(nullptr),
m_num_vector_elements(num_vector_elements)
{
allocate(num_vector_elements);
}
template<typename W>
vec_array<W>::~vec_array()
{
free();
}
template<typename W>
void vec_array<W>::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<typename W::VecT*>(_mm_malloc(m_num_vector_elements*sizeof(typename W::VecT), AVX_alignment));
}
template<typename W>
void vec_array<W>::free()
{
if(m_pdata != nullptr)
_mm_free(m_pdata);
}

typedef vec_array<__m256_wrapper> vec256;
int main()
{
vec256 test_vec(10);
}