मैं टेम्पलेट वर्ग के लिए तर्क के रूप में __m256 का उपयोग कर रहा हूं (नीचे कोड देखें)। जब उबंटू 16.10 पर जी के साथ संकलन ++ संस्करण 6.2, यह मेरे बारे में गुण टेम्पलेट तर्क पर ध्यान नहीं दिया जा चेतावनी देते हैं:जीसीसी चेतावनी का प्रभाव: टेम्पलेट तर्क पर विशेषताओं को अनदेखा करना (-विग्नर-गुण)
warning: ignoring attributes on template argument ‘__m256 {aka __vector(8) float}’ [-Wignored-attributes] typedef vec_array<__m256> vec256
__m256 प्रकार संरेखण के विषय में कुछ गुण लगता है (और शायद कुछ अन्य लोगों के?)। नीचे दिखाए गए इस आदिम कंटेनर वर्ग का एकमात्र उद्देश्य (और जो चेतावनी उत्पन्न करता है) इन विशेष इंटेल चर (__m256, __m128, आदि) के लिए ढेर पर स्मृति संरेखण को संभालना है।
जब मैं अपने समग्र कार्यक्रम में इस कंटेनर क्लास का उपयोग करता हूं, तो यह ठीक काम करता प्रतीत होता है। हालांकि, मेरा सवाल यह है कि जब gcc इन विशेषताओं को अनदेखा कर रहा है तो प्रभाव यह है कि (मैंने पहले ही पढ़ा है कि इस मुद्दे पर जीसीसी मैनुअल को क्या कहना है)।
- क्या कोई इन चेतावनियों से छुटकारा पाने का एक अच्छा तरीका देखता है?
- क्या मुझे इसके बारे में चिंता करने की ज़रूरत है?
- यदि मैं इस चेतावनी को अनदेखा करता हूं तो सबसे बुरा क्या हो सकता है?
संदर्भ के लिए, नीचे दिया गया कोड इस चेतावनी का उत्पादन करता है।
इस मामले पर किसी भी मदद या टिप्पणी की बहुत सराहना की जाती है, धन्यवाद।
///////////////////////////////////////////////////////////////////////////////
// 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);
}