首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVX512非法指令

AVX512非法指令
EN

Stack Overflow用户
提问于 2018-08-14 13:58:33
回答 1查看 987关注 0票数 0

在我的previous post中,我解释说我从AVX开始是为了加速我的代码(请注意,尽管这篇文章有一些共同之处,但据我所知,这篇文章引用了AVX512和之前的AVX2,它们略有不同,需要不同的编译标志)。在尝试使用AVX2之后,我决定尝试使用AVX512,并更改了我的AVX2函数:

代码语言:javascript
复制
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];
  }
}

我认为它应该是等价物:

代码语言:javascript
复制
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形式中是:

代码语言:javascript
复制
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);
    ;
  }
}

编译代码后,我得到以下错误:

代码语言:javascript
复制
Illegal instruction (core dumped)

令我惊讶的是,这个错误发生在getData函数中的sqrt调用中。如果我删除了sqrt调用,那么错误就会出现在__m512d divisor = _mm512_set_pd((d....中更靠前的位置。你知道发生了什么事吗?

Here是完整的示例。

非常感谢。

我使用以下选项-std=c++17 -Wall -Wextra -O3 -fno-tree-vectorize -mavx512f使用c++ (7.3.0)进行编译。我已按照说明检查了here和我的CPU (英特尔(R)酷睿(TM) i7-4710HQ CPU @2.50 and )支持AVX2。列表中是否应该有AVX-512来表示支持?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-14 14:24:01

我不认为你的系统(CPU)支持AVX-512指令。考虑到official documentation,它只提到了AVX-2。newer CPU会显示AVX-512完好无损。这两个都可以在“指令集扩展”部分找到。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51834585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档