我已经和SSE合作了一段时间了,我已经看到了我的对齐问题.然而,这超出了我的理解:
无论我是使用F5(调试)运行程序还是在调试器外运行它(Ctrl + F5),我都会得到不同的对齐方式!
一些背景信息:我正在使用包装器来启用SSE数据类型 - 使用重载运算符和自定义分配器(重载new和delete运算符使用_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) 如何检查我的Linux Box安装安装是否具有SSE指令功能?
我正在尝试安装libjpeg-turbo,我想确保它充分利用我的盒子的功能.
我有一个非常简单的程序,我正在努力提高性能.我知道的一种方法是帮助使用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)
我已经阅读了一些关于此的内容,并理解了这个想法,但我完全不知道如何实现这一点.有人可以帮帮我吗?我认为这很简单,特别是对于我的简单程序,但有时候入门是最难的部分.
谢谢!
我正在尝试使用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) 我正在尝试为一些简单的向量数学函数编写单元测试,这些函数在单精度浮点数的数组上运行.这些函数使用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 …
我正在尝试使用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.我一直在指这些内在函数的参考,但我无法找出我的逻辑在这里出了什么问题.有什么建议?
我试图说服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调用以获得矢量化代码?
至于今天我使用我自己的min()函数(for float和int)基于if但是今天我知道x86有一些操作数为min - 这是
MINSS - 操作数的最小值
我认为如果基于min()例程是有效的并且我非常小心优化,所以我想将自己的例程重写为minss带有内联汇编的版本,
我想找到gcc内联汇编中最有效的版本如何
我需要类似的东西
int min(int a, int b)
{
// minss a, b
//return
}
Run Code Online (Sandbox Code Playgroud)
两个int和float,使用minss操作码和具有最小的序幕和尾声
或者只是使用库版本会更快?虽然我不想使用库min/max并尽可能快地使用它
我正在对每个像素执行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) 我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) sse ×10
c++ ×7
c ×3
simd ×3
avx ×2
performance ×2
x86 ×2
alignment ×1
assembly ×1
g++ ×1
gcc ×1
intrinsics ×1
libjpeg ×1
linux ×1
optimization ×1
sse3 ×1
unit-testing ×1