5

我已经用 g++ 编写和调试了一些 AVX 代码,现在我正试图让它与 MSVC 一起工作,但我一直在

错误 LNK2019:未解析的外部符号 __mm256_setr_epi64x 在函数“private: union __m256i __thiscall avx_matrix::avx_bit_mask(unsigned int)const”(?avx_bit_mask@avx_matrix@@ABE?AT__m256i@@I@Z)

引用的代码是

...

#include <immintrin.h>

...

    /* All zeros except for pos-th position (0..255) */
    __m256i avx_matrix::avx_bit_mask(const std::size_t pos) const
    {
        int64_t a = (pos >= 0 && pos < 64) ? 1LL << (pos - 0) : 0;
        int64_t b = (pos >= 64 && pos < 128) ? 1LL << (pos - 64) : 0;
        int64_t c = (pos >= 128 && pos < 192) ? 1LL << (pos - 128) : 0;
        int64_t d = (pos >= 192 && pos < 256) ? 1LL << (pos - 256) : 0;
        return _mm256_setr_epi64x(a, b, c, d);
    }
...
  • 我启用/arch:AVX了,但它没有任何区别。
  • 我的机器绝对支持 AVX——它与我用于原始 Linux 项目的机器相同。
  • 此外, http: //msdn.microsoft.com/en-us/library/hh977022.aspx列出_mm256_setr_epi64x了可用的内在函数。

任何帮助将非常感激。

4

2 回答 2

5

看起来这实际上可能是一个已知的错误——某些 AVX 内在函数显然在 32 位模式下不可用。尝试构建 64 位和/或升级到 Visual Studio 2013 Update 2,据说现在已经修复了。

或者,如果您只有上面使用此内在函数的一个实例,那么您可以将函数更改为:

__m256i avx_matrix::avx_bit_mask(const std::size_t pos) const
{
    int64_t a[4] = { (pos >=   0 && pos <  64) ? 1LL << (pos -   0) : 0,
                     (pos >=  64 && pos < 128) ? 1LL << (pos -  64) : 0,
                     (pos >= 128 && pos < 192) ? 1LL << (pos - 128) : 0,
                     (pos >= 192 && pos < 256) ? 1LL << (pos - 256) : 0 };
    return _mm256_loadu_si256((__m256i *)a);
}

或者甚至:

__m256i avx_matrix::avx_bit_mask(const std::size_t pos) const
{
    int64_t a[4] = { 0 };
    a[pos >> 6] = 1LL << (pos & 63ULL);
    return _mm256_loadu_si256((__m256i *)a);
}

可能会更有效率。

于 2014-12-02T21:14:56.530 回答
5

在 32 位模式下 MSVC 不支持

  • _mm_set_epi64x
  • _mm_setr_epi64x
  • _mm_set1_epi64x
  • _mm256_set_epi64x
  • _mm256_setr_epi64x
  • _mm256_set1_epi64x

在您的 32 位模式下,您可以这样做:

    union {
        int64_t q[4];
        int32_t r[8];
    } u;
    u.q[0] = a; u.q[1] = b; u.q[2] = c; u.q[3] = d;
    return _mm256_setr_epi32(u.r[0], u.r[1], u.r[2], u.r[3], u.r[4], u.r[5], u.r[6], u.r[7]);

自 Visual Studio 2015 (_MSC_VER 1900) 起,这些内在函数在 32 位模式下受支持。

于 2014-12-03T08:53:10.290 回答