标签: sse

如果在调试器中运行,则Visual Studio中的数据未正确对齐

我已经和SSE合作了一段时间了,我已经看到了我的对齐问题.然而,这超出了我的理解:

无论我是使用F5(调试)运行程序还是在调试器外运行它(Ctrl + F5),我都会得到不同的对齐方式!

一些背景信息:我正在使用包装器来启用SSE数据类型 - 使用重载运算符和自定义分配器(重载newdelete运算符使用_mm_malloc_mm_free).但是在下面的例子中,我已经设法进一步减少问题,即即使我不使用自定义分配器也会发生问题.

如下所示,在main()中,我在堆上动态分配一个TestClass对象,该对象包含一个SSEVector类型对象.我正在使用一个虚拟float[2]成员变量来"错位"堆栈.

当我使用F5运行时,我获得以下输出:

object address 00346678
_memberVariable1 address 00346678
_sseVector address 00346688
Run Code Online (Sandbox Code Playgroud)

如果我使用Ctrl + F5运行:

object address 00345B70
_memberVariable1 address 00345B70
_sseVector address 00345B80
Run Code Online (Sandbox Code Playgroud)

如您所见,当我在调试器中运行它时,对齐方式是不同的(即不是16字节).使用Ctrl-F5时对齐是否正确只是巧合?我正在使用带有新项目的Visual Studio 2010(默认设置).

如果我在堆栈上声明对象,即TestClass myObject;,此问题不会出现.使用__declspec(align(16))也无济于事.

我用来重现问题的代码:

#include <iostream>
#include <string>
#include <xmmintrin.h>  // SSE
//#include "DynAlignedAllocator.h"

//////////////////////////////////////////////////////////////
class SSEVector /*: public DynAlignedAllocator<16>*/
{
public:
    SSEVector() { }

    __m128 vec;
};

class TestClass
{
public:
    TestClass() { …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction sse alignment visual-studio

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

如何检查我的Linux Box安装安装是否具有SSE指令功能?

如何检查我的Linux Box安装安装是否具有SSE指令功能?

我正在尝试安装libjpeg-turbo,我想确保它充分利用我的盒子的功能.

c++ linux sse simd libjpeg

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

真正基本的SSE

我有一个非常简单的程序,我正在努力提高性能.我知道的一种方法是帮助使用SSE3(因为我工作的机器支持这个),但我完全不知道如何做到这一点.这是一个代码片段(c ++):

int sum1, sum2, sum3, sum4;
for (int i=0; i<length; i+=4) {
  for (int j=0; j<length; j+=4) {
    sum1 = sum1 + input->value[i][j];
    sum2 = sum2 + input->value[i+1][j+1];
    sum3 = sum3 + input->value[i+2][j+3];
    sum4 = sum4 + input->value[i+3][j+4];    
  {
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些关于此的内容,并理解了这个想法,但我完全不知道如何实现这一点.有人可以帮帮我吗?我认为这很简单,特别是对于我的简单程序,但有时候入门是最难的部分.

谢谢!

c++ optimization performance sse sse3

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

SSE g ++编译问题

我正在尝试使用SSE内在函数.我已经制作了一个测试程序,它只添加了两个带有四个16位元素的向量.

#include <xmmintrin.h>
#include <iostream>
using namespace std;

void test_vec_add(){
  const int length = 4;
  float product[128*4]  __attribute__ ((aligned(16)));
  _m128 x = _mm_set_ps(1.0f,2.0f,3.0f,4.0f);
  _m128 y = _mm_set_ps(1.0f,2.0f,3.0f,4.0f);
  _m128 z = _mm_add_ps(x,y);
  _mm_store_ps(product,z);
}
int main(){
  test_vec_add();
}
Run Code Online (Sandbox Code Playgroud)

我正在编译这段代码

g++ -msse3 test_sse.cpp
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下复杂错误

test_sse.cpp: In function ‘void test_vec_add()’:
test_sse.cpp:7:3: error: ‘_m128’ was not declared in this scope
test_sse.cpp:7:9: error: expected ‘;’ before ‘x’
test_sse.cpp:8:9: error: expected ‘;’ before ‘y’
test_sse.cpp:9:9: error: expected ‘;’ before ‘z’
test_sse.cpp:10:24: error: ‘z’ was not declared …
Run Code Online (Sandbox Code Playgroud)

c++ sse g++

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

如何在单元测试中避免浮点舍入错误?

我正在尝试为一些简单的向量数学函数编写单元测试,这些函数在单精度浮点数的数组上运行.这些函数使用SSE内在函数,当在32位系统上运行测试时,我会得到误报(至少我认为)(测试通过64位).当操作通过数组运行时,我累积越来越多的舍入错误.这是一个单元测试代码和输出的片段(我的实际问题如下):

测试设置:

static const int N = 1024;
static const float MSCALAR = 42.42f;

static void setup(void) {
    input = _mm_malloc(sizeof(*input) * N, 16);
    ainput = _mm_malloc(sizeof(*ainput) * N, 16);
    output = _mm_malloc(sizeof(*output) * N, 16);
    expected = _mm_malloc(sizeof(*expected) * N, 16);

    memset(output, 0, sizeof(*output) * N);

    for (int i = 0; i < N; i++) {
        input[i] = i * 0.4f;
        ainput[i] = i * 2.1f;
        expected[i] = (input[i] * MSCALAR) + ainput[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我的主要测试代码调用要测试的函数(用于生成expected数组的相同计算)并根据expected …

c floating-point unit-testing sse floating-accuracy

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

使用SSE内在函数时结果不正确

我正在尝试使用SSE内在函数的8个浮点数组的每个元素,只是为了学习如何使用它们.但是,当我尝试这样写时:

alignas(16) float Numbers[8] = 
{0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f};    

__m128 Group1 = _mm_load_ps(Numbers);
__m128 Group2 = _mm_load_ps(Numbers + 4*sizeof(float));
__m128 Zero = _mm_setzero_ps();

__m128 Sum1 = _mm_add_ps(Group1, Group2);     // Sum1 = Group1 + Group2
__m128 Sum2 = _mm_hadd_ps(Sum1, Zero);        // Sum2[31:0] = Sum1[31:0] + Sum1[63:32]
                                              // Sum2[63:32] = Sum1[95:64] + Sum1[127:96]
__m128 Sum3 = _mm_hadd_ps(Sum2, Zero);        // Sum3[31:0] = Sum2[31:0] + Sum2[63:32]

float Result;
_mm_store_ss(&Result, Sum3);
Run Code Online (Sandbox Code Playgroud)

Result当它应该是28时,它出现了6.我一直在指这些内在函数的参考,但我无法找出我的逻辑在这里出了什么问题.有什么建议?

c++ x86 sse simd intrinsics

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

矢量化平方残差与gcc/clang之和无内在函数

我试图说服gcc(4.8.1)或clang(3.4)在常春藤网桥处理器上矢量化以下代码:

#include "stdlib.h"
#include "math.h"

float sumsqr(float *v, float mean, size_t n) {
    float ret = 0;
    for(size_t i = 0; i < n; i++) {
        ret += pow((v[i] - mean), 2);
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

并编译它没有成功

$ gcc -std=c99 -O3 -march=native -mtune=native -ffast-math -S foo.c
Run Code Online (Sandbox Code Playgroud)

有没有办法修改代码而不使用instrinsics或修改gcc调用以获得矢量化代码?

c performance sse avx

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

最小的gcc内联汇编

至于今天我使用我自己的min()函数(for floatint)基于if但是今天我知道x86有一些操作数为min - 这是

MINSS - 操作数的最小值

我认为如果基于min()例程是有效的并且我非常小心优化,所以我想将自己的例程重写为minss带有内联汇编的版本,

我想找到gcc内联汇编中最有效的版本如何

我需要类似的东西

int min(int a, int b)
{
  // minss a, b
   //return 
}
Run Code Online (Sandbox Code Playgroud)

两个intfloat,使用minss操作码和具有最小的序幕和尾声

或者只是使用库版本会更快?虽然我不想使用库min/max并尽可能快地使用它

x86 assembly gcc sse

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

32位8位比较形成32位汉明字符串

我正在对每个像素执行32次比较的图像执行人口普查变换.我可以有效地生成一个0x0100010100010100的256位向量...其中每个8位对应于0x00或0x01.该载体在下面标识为"比较".我需要折叠这个256位向量来生成一个32位的汉明字符串.数组'census'是我存储8位比较的地方.请注意,此时我并不关心汉明距离,我只对尽快生成字符串感兴趣.我有AVX2可供我使用.我目前的代码:

uint8_t* census = (uint8_t*) _mm_malloc(sizeof(int)*8,32);

...

_mm256_storeu_si256((__m256i*) census, comparisons);

uint32_t hammingString = (uint32_t) (census[0] +
                                    (census[1] << 1)   +
                                    (census[2] << 2)   +
                                    ...
                                    (census[31] << 31));
Run Code Online (Sandbox Code Playgroud)

c c++ sse simd avx

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

为什么我在这里获得堆栈溢出?

SSE用来实现矩阵乘法,我Stack Overflow Exception在运行代码时得到了.而且stack overflow exception是在chktsk.asm

; Find next lower page and probe
cs20:
        sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
        test    dword ptr [eax],eax     ; probe page.
        jmp     short cs10

_chkstk endp

        end
Run Code Online (Sandbox Code Playgroud)

很难发现哪里出错了,我的代码是:

main.cpp

#include "sse_matrix.h"

int main(int argc, char* argv[])
{
    float left[size] = {0};
    float right[size] = {0};
    float result[size] = {0};
    // initialize value
    for (int i = 0; i < dim; i ++)
    {
        for (int j = …
Run Code Online (Sandbox Code Playgroud)

c++ stack-overflow sse

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