簡體   English   中英

AVX512非法指令

[英]AVX512 illegal instruction

在我之前的帖子中,我解釋說我從 AVX 開始以加速我的代碼(請注意,雖然有一些共同點,但這篇帖子指的是 AVX512,而上一篇指的是 AVX2,據我所知,它們略有不同並且需要不同的編譯標志)。 在嘗試了 AVX2 之后,我決定嘗試使用 AVX512 並更改了我的 AVX2 function:

void getDataAVX2(u_char* data, size_t cols, std::vector<double>& info)
{
  __m256d dividend = _mm256_set_pd(1 / 64.0, 1 / 64.0, 1 / 64.0, 1 / 64.0);
  info.resize(cols);
  __m256d result;
  for (size_t i = 0; i < cols / 4; i++)
  {
    __m256d divisor = _mm256_set_pd((double(data[4 * i + 3 + cols] << 8) + double(data[4 * i + 2 * cols + 3])),
                                    (double(data[4 * i + 2 + cols] << 8) + double(data[4 * i + 2 * cols + 2])),
                                    (double(data[4 * i + 1 + cols] << 8) + double(data[4 * i + 2 * cols + 1])),
                                    (double(data[4 * i + cols] << 8) + double(data[4 * i + 2 * cols])));
    result = _mm256_sqrt_pd(_mm256_mul_pd(divisor, dividend));
    info[size_t(4 * i)] = result[0];
    info[size_t(4 * i + 1)] = result[1];
    info[size_t(4 * i + 2)] = result[2];
    info[size_t(4 * i + 3)] = result[3];
  }
}

因為我認為應該是它的等價物:

void getDataAVX512(u_char* data, size_t cols, std::vector<double>& info)
{
  __m512d dividend = _mm512_set_pd(1 / 64.0, 1 / 64.0, 1 / 64.0, 1 / 64.0, 1 / 64.0, 1 / 64.0, 1 / 64.0, 1 / 64.0);
  info.resize(cols);
  __m512d result;
  for (size_t i = 0; i < cols / 8; i++)
  {
    __m512d divisor = _mm512_set_pd((double(data[4 * i + 7 + cols] << 8) + double(data[4 * i + 2 * cols + 7])),
                                    (double(data[4 * i + 6 + cols] << 8) + double(data[4 * i + 2 * cols + 6])),
                                    (double(data[4 * i + 5 + cols] << 8) + double(data[4 * i + 2 * cols + 5])),
                                    (double(data[4 * i + 4 + cols] << 8) + double(data[4 * i + 2 * cols + 4])),
                                    (double(data[4 * i + 3 + cols] << 8) + double(data[4 * i + 2 * cols + 3])),
                                    (double(data[4 * i + 2 + cols] << 8) + double(data[4 * i + 2 * cols + 2])),
                                    (double(data[4 * i + 1 + cols] << 8) + double(data[4 * i + 2 * cols + 1])),
                                    (double(data[4 * i + cols] << 8) + double(data[4 * i + 2 * cols])));
    result = _mm512_sqrt_pd(_mm512_mul_pd(divisor, dividend));
    info[size_t(4 * i)] = result[0];
    info[size_t(4 * i + 1)] = result[1];
    info[size_t(4 * i + 2)] = result[2];
    info[size_t(4 * i + 3)] = result[3];
    info[size_t(4 * i + 4)] = result[4];
    info[size_t(4 * i + 5)] = result[5];
    info[size_t(4 * i + 6)] = result[6];
    info[size_t(4 * i + 7)] = result[7];
  }
}

在非 AVX 形式中是:

void getData(u_char* data, size_t cols, std::vector<double>& info)
{
  info.resize(cols);
  for (size_t i = 0; i < cols; i++)
  {
    info[i] = sqrt((double(data[cols + i] << 8) + double(data[2 * cols + i])) / 64.0);
    ;
  }
}

編譯代碼后,我收到以下錯誤:

Illegal instruction (core dumped)

令我驚訝的是,這個錯誤發生在getData function 中的sqrt調用中。 如果我刪除sqrt調用,那么錯誤會進一步出現在__m512d divisor = _mm512_set_pd((d.... 。關於發生了什么的任何想法?

是完整的示例。

非常感謝。

我正在使用c++ (7.3.0) 和以下選項-std=c++17 -Wall -Wextra -O3 -fno-tree-vectorize -mavx512f 我已經按照此處的說明進行了檢查,並且我的 CPU(Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz)支持 AVX2。 該列表是否應該有 AVX-512 來表明對此的支持?

我認為您的系統(CPU)不支持AVX-512指令。 考慮官方文件 它只提到了AVX-2。 較新的CPU將指示AVX-512完全正常。 兩者都可以在“指令集擴展”部分中找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM