AVX512 非法指令
AVX512 illegal instruction
在我之前的帖子中,我解释说我从AVX开始是为了加快我的代码速度(请注意,虽然有一些共同点,但这篇文章指的是AVX512和前一个AVX2,据我所知,它们略有不同,需要不同的编译标志(。在尝试了AVX2之后,我决定尝试使用AVX512并更改了AVX2功能:
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
函数中调用sqrt
时。如果我删除sqrt
调用,则错误将进一步向前显示,在__m512d divisor = _mm512_set_pd((d....
中。对正在发生的事情有什么想法吗?
这是完整的示例。
谢谢。
我正在使用c++
(7.3.0(进行编译,-std=c++17 -Wall -Wextra -O3 -fno-tree-vectorize -mavx512f
以下选项。我已经按照此处的说明进行了检查,我的CPU(英特尔(R(酷睿(TM(i7-4710HQ CPU @ 2.50GHz(支持AVX2。列表是否应该有 AVX-512 来指示对此的支持?
我认为您的系统(CPU(不支持AVX-512指令。考虑官方文件;它只提到了AVX-2。较新的CPU将指示AVX-512完全正常。两者都可以在"指令集扩展"部分下找到。
相关文章:
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++中的移动分配出现问题.非法指令: 4.
- while 循环 c++ 中的非法指令
- 来自 VS C++ 在 Windows 上的非法指令
- AVX512 非法指令
- 在Visual "Microsoft studio 2019"上设置OpenCV 4.1.1时遇到问题?(非法指令。
- 在运行基本 Avx512 代码时获取非法指令
- exe_common.inl中的非法指令
- 从C 调用Tensorflow Lite .tflite CNN模型时,非法指令
- _mm_fmadd_pd程序收到信号SIGILL,非法指令
- 仅在64位释放模式中的位移位非法指令
- 程序收到信号Sigill非法指令
- 标准::字符串中的非法指令
- 获取列表的第一个和最后一个元素<string>给我非法指令错误
- 为什么Folloing代码在2010年Visual Studio(X64应用程序)中抛出非法指令例外
- std::p romise::get_future 提出非法指令 (SIGILL)
- 使用mpopcnt编译会导致非法指令错误
- 使用带有自定义对齐分配器实现的最新g++,使用SSE和-O3选项编译时出现非法指令(核心转储)
- 程序接收到信号SIGILL,非法指令
- 在VMWare机器上编译的程序在亚马逊服务器上运行时会因非法指令而崩溃