【问题标题】:print out the content of __m256i variable打印出 __m256i 变量的内容
【发布时间】:2018-08-15 15:18:34
【问题描述】:

我正在尝试打印出__m256i 变量的值,但出现运行时错误(file.exe 已停止工作!)。我的 CPU 是 Intel 并且支持 AVX 指令。当我评论 cout 行时,代码运行。我正在使用英特尔 C++ 编译器。问题是什么?有没有其他方法可以显示__m256i 变量的内容。我的代码如下:

#include <iostream>
#include <iomanip>
#include "immintrin.h"

using namespace std;

int main()
{
    __m256i a;
    int i;

    a = _mm256_set_epi64x(1, 2, 3, 4);

    cout << setfill('0'); // fill with 0s

    for (i = 0; i < 4; i++) {

        cout << hex << setw(16) << _mm256_extract_epi64(a, i);

    }

    cout << endl;

    cin.get();

    return 0;
}

【问题讨论】:

  • 它实际编译成什么?尤其是那个提取物,如果不展开循环,这是不可能的
  • 是的,编译没有问题。顺便说一句,问题出在 cout 而不是 extract 指令上。没有循环,代码也无法工作(例如 i = 0)。
  • Intel ICC(17 或 18)甚至不编译它(至少在 Linux 上)。 clang 是我发现的唯一一个可以展开循环以获取提取索引的编译时常量的编译器。您使用的是哪个版本的 ICC?
  • 我使用 nodepad 输入代码,然后使用 ICC 18 编译它(例如 icl test.cpp),然后运行 ​​exe 文件。我的操作系统是 Windows 10 64 位。无论如何,有没有其他方法可以显示变量a的内容?
  • 如果您使用的是G2020 the spec sheet,则表明它不支持AVX。仅支持英特尔® SSE4.1、英特尔® SSE4.2 扩展。

标签: c++ windows x86 simd avx


【解决方案1】:

您可以尝试使用next函数打印__m256i向量的内容:

#include <immintrin.h>
#include <iostream>
#include <iomanip>    

template<class T> inline void Log(const __m256i & value)
{
    const size_t n = sizeof(__m256i) / sizeof(T);
    T buffer[n];
    _mm256_storeu_si256((__m256i*)buffer, value);
    for (int i = 0; i < n; i++)
        std::cout << buffer[i] << " ";
}

int main()
{
    __m256i a = _mm256_set_epi64x(1, 2, 3, 4);
    Log<long>(a);
    return 0;
}

【讨论】:

  • 我也遇到了与此代码相同的运行时错误。也许问题与我的CPU有关。我的 CPU 是 Intel G2020。
  • long long 是否缺少括号?
  • 或者你的意思是使用(T)而不是long long
  • CPU G2020 不支持 AVX 或 AVX2。
  • 相关:print a __m128i variable 了解为什么存储到 tmp 数组是一件好事,以及为什么进行指针转换不安全。
猜你喜欢
  • 1970-01-01
  • 2011-01-23
  • 2014-08-06
  • 2018-08-09
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多