2014-12-02 2 views
4

я написал и отлажены некоторые AVX код с г ++ и теперь я пытаюсь заставить его работать с MSVC, но я получаюнеразрешенный внешний символ __mm256_setr_epi64x

ошибка LNK2019: неразрешенный внешний символ __mm256_setr_epi64x ссылка в функция "частное: объединение __m256i __thiscall avx_matrix :: avx_bit_mask (без знака целое) 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 среди доступных свойств.

Любая помощь будет очень признательна.

ответ

3

Похоже, что это может быть known bug - некоторые встроенные средства AVX, по-видимому, недоступны в 32-битном режиме. Попытайтесь создать 64-разрядную версию и/или обновить до версии Update 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); 
} 

который мощи быть немного более эффективным.

+0

Ваша ссылка говорит: «Это соединение ненадежный». –

+2

Хех - похоже, Microsoft забыла обновить свой сертификат. –

+1

Ну +1 для обнаружения, что это якобы было исправлено. Тем не менее, это 2014. Кто действительно использует 32-битный режим? OS X теперь только 64-битная. Ubuntu постепенно отказывается от 32-битного за один год. MSFT должен был установить это 8 лет назад. –

4

В 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]); 
Смежные вопросы