代码之家  ›  专栏  ›  技术社区  ›  apalomer

AVX512非法指令

  •  0
  • apalomer  · 技术社区  · 7 年前

    在我的 previous post

    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)
    

    sqrt getData sqrt公司 调用,则错误将进一步显示在 __m512d divisor = _mm512_set_pd((d....

    Here 是一个完整的例子。

    我正在编译 c++ (7.3.0)具有以下选项 -std=c++17 -Wall -Wextra -O3 -fno-tree-vectorize -mavx512f . 我已经按说明检查过了 here 我的CPU(Intel(R)Core(TM)i7-4710HQ CPU@2.50GHz)支持AVX2。列表中是否应该有AVX-512来表示对此的支持?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Caramiriel    7 年前

    我认为您的系统(CPU)不支持AVX-512指令。接受 official documentation 考虑到;它只提到AVX-2。一个 newer CPU