相关疑难解决方法(0)

如何检查CPU是否支持SSE3指令集?

以下代码是否有效以检查CPU是否支持SSE3指令集?

使用该IsProcessorFeaturePresent()功能显然不适用于Windows XP(请参阅http://msdn.microsoft.com/en-us/library/ms724482(v=vs.85).aspx).

bool CheckSSE3()
{
    int CPUInfo[4] = {-1};

    //-- Get number of valid info ids
    __cpuid(CPUInfo, 0);
    int nIds = CPUInfo[0];

    //-- Get info for id "1"
    if (nIds >= 1)
    {
        __cpuid(CPUInfo, 1);
        bool bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false;
        return bSSE3NewInstructions;     
    }

    return false;      
}
Run Code Online (Sandbox Code Playgroud)

c++ sse instruction-set avx cpuid

59
推荐指数
5
解决办法
3万
查看次数

应用程序如何确定指令集是否可用并在可用时使用它?

有趣的是它在游戏和其他软件中的工作原理。
更准确地说,我正在寻求一个解决方案C++
就像是:

if AMX available -> Use AMX version of the math library
else if AVX-512 available -> Use AVX-512 version of the math library
else if AVX-256 available -> Use AVX-256 version of the math library
etc.  
Run Code Online (Sandbox Code Playgroud)

我的基本想法是在不同的 DLL 中编译库并在运行时交换它们,但这对我来说似乎不是最好的解决方案。

c++ windows assembly instruction-set cpuid

18
推荐指数
2
解决办法
2873
查看次数

哪个版本的Windows支持/需要哪些CPU多媒体扩展?

到目前为止,我已经设法找到:

  • 对于Windows 8及更高版本(当然对于任何64位操作系统),SSE和SSE2都是必需的
  • AVX仅受Windows 7 SP1或更高版本支持

有关在Windows上使用SSE3,SSSE3,SSE4.1,SSE 4.2,AVX2和AVX-512的注意事项吗?

一些澄清:如果我使用其中一个SSE/AVX集合的指令,我需要这个来确定我的程序运行的操作系统.

windows assembly sse avx avx512

9
推荐指数
1
解决办法
1199
查看次数

如何在Linux计算机上禁用avx指令?

或者更具体地说,我如何确保/ proc/cpuinfo和CPUID操作码不显示AVX已启用?

(对于上下文,某些Amazon EC2实例上存在一个错误,其中AVX被错误地报告为活动状态,导致动态使用AVX指令的程序与SIGILL崩溃).

我已经看过这个内核补丁:https://patchwork.kernel.org/patch/1521191/,但我不确定这是否会影响内核的avx使用情况,还是补丁CPUID和/ proc/cpuinfo.无论如何,我希望找到适用于Linux 2.6.x内核系列的解决方案.

linux linux-kernel avx

8
推荐指数
0
解决办法
1456
查看次数

如何在运行时验证架构是否匹配 -march=?

我们用 编译我们的代码g++ -march=ivybridge -mtune=skylake。如果有人在较旧/不兼容的架构上运行,我希望应用程序能够优雅地通知并退出。我该怎么做呢?AMD处理器怎么样?是否存在某种同等的架构/指令?

c++ x86 gcc cpu-architecture

8
推荐指数
1
解决办法
313
查看次数

AVX标量操作要快得多

我测试了以下简单的功能

void mul(double *a, double *b) {
  for (int i = 0; i<N; i++) a[i] *= b[i];
}
Run Code Online (Sandbox Code Playgroud)

具有非常大的数组,因此它受内存带宽限制.我使用的测试代码如下.当我用-O2它编译它需要1.7秒.当我用-O2 -mavx它编译它只需要1.0秒.非vex编码的标量操作慢了70%!为什么是这样?

这里是为大会-O2-O2 -mavx. <code> -O2 </ code>和<code> -O2 -mavx </ code>的vimddif

https://godbolt.org/g/w4p60f

系统:i7-6700HQ@2.60GHz(Skylake)32 GB内存,Ubuntu 16.10,GCC 6.3

测试代码

//gcc -O2 -fopenmp test.c
//or
//gcc -O2 -mavx -fopenmp test.c
#include <string.h>
#include <stdio.h>
#include <x86intrin.h>
#include <omp.h>

#define N 1000000
#define R 1000

void mul(double *a, double *b) {
  for (int i = 0; i<N; i++) a[i] …
Run Code Online (Sandbox Code Playgroud)

c memory x86 sse avx

5
推荐指数
1
解决办法
490
查看次数

与 AVX/AVX2 一起使用的最低 OS X 版本是什么?

我有一个图像绘制例程,为 SSE、SSE2、SSE3、SSE4.1、SSE4.2、AVX 和 AVX2 编译多次。我的程序通过检查 CPUID 标志来动态调度这些二进制变体之一。

在 Windows 上,我检查 Windows 版本,如果操作系统不支持 AVX/AVX2 调度,则禁用它们。(例如,仅 Windows 7 SP1 或更高版本支持 AVX/AVX2。)

我想在 Mac OS X 上做同样的事情,但我不确定哪个版本的 OS X 支持 AVX/AVX2。

请注意,我想知道的是与 AVX/AVX2 一起使用的 OS X 的最低版本。不支持 AVX/AVX2 的机器型号。

macos sse avx avx2

3
推荐指数
1
解决办法
6938
查看次数

标签 统计

avx ×5

sse ×4

c++ ×3

assembly ×2

cpuid ×2

instruction-set ×2

windows ×2

x86 ×2

avx2 ×1

avx512 ×1

c ×1

cpu-architecture ×1

gcc ×1

linux ×1

linux-kernel ×1

macos ×1

memory ×1