这是我第一次使用SSE内在函数.我试图将一段简单的代码转换为使用英特尔SSE内在的更快的版本(直到SSE4.2).我好像遇到了一些错误.
代码的标量版本是:(简单矩阵乘法)
void mm(int n, double *A, double *B, double *C)
{
int i,j,k;
double tmp;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++) {
tmp = 0.0;
for(k = 0; k < n; k++)
tmp += A[n*i+k] *
B[n*k+j];
C[n*i+j] = tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的版本:我已经包含了 #include <ia32intrin.h>
void mm_sse(int n, double *A, double *B, double *C)
{
int i,j,k;
double tmp;
__m128d a_i, b_i, c_i;
for(i = 0; i < n; i++)
for(j …
Run Code Online (Sandbox Code Playgroud) 我试图在Intel i3处理器上找到32个元素(每个1字节数据)的总和减少量.我这样做了:
s=0;
for (i=0; i<32; i++)
{
s = s + a[i];
}
Run Code Online (Sandbox Code Playgroud)
但是,由于我的应用程序是一个需要更少时间的实时应用程序,因此需要花费更多时间.请注意,最终金额可能超过255.
有没有办法可以使用低级SIMD SSE2指令实现这一点?不幸的是我从未使用过SSE.我试图为此目的搜索sse2函数,但它也不可用.(sse)是否可以保证减少这种小型问题的计算时间?
有什么建议??
注意:我已经使用OpenCL和CUDA实现了类似的算法,虽然问题规模很大,但效果很好.对于小型问题,开销成本更高.不确定它在SSE上是如何工作的
如何_mm_mwait
从pmmintrin.h
工作?(我的意思不是它的主题,而是行动以及如何在NUMA系统中采取这种行动.store
监控很容易只在基于总线的SMP系统上实现,并且可以监听总线.)
什么处理器实现它?
它是否用于某些螺旋锁?
我遇到这个错误的问题:"未启用SSE指令集".我怎么能搞清楚这一点?
我有ACER i7,Ubuntu 11.10,请任何人可以帮帮我吗?
任何帮助将不胜感激!
还运行:
sudo cat /proc/cpuinfo | grep flags
Run Code Online (Sandbox Code Playgroud)
得到:
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clfl
ush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfm
on pebs bts xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl
vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 x2apic popcnt xsave avx lahf_lm
ida arat epb xsaveopt pln …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个复杂的模拟程序,它表明最常用的例程就是将四向量(float4)与4x4矩阵相乘.我需要在几台计算机上运行这个程序,这些计算机或多或少都是旧的.这就是我尝试在以下代码中检查此类操作的SIMD功能的原因:
//#include <xmmintrin.h> // SSE
//#include <pmmintrin.h> // SSE3
//#include <nmmintrin.h> // SSE4.2
#include <immintrin.h> // AVX
#include <iostream>
#include <ctime>
#include <string>
using namespace std;
// 4-vector.
typedef struct
{
float x;
float y;
float z;
float w;
}float4;
// typedef to simplify the pointer of function notation.
typedef void(*Function)(float4&,const float4*,const float4&);
float dot( const float4& in_A, const float4& in_x )
{
return in_A.x*in_x.x + in_A.y*in_x.y + in_A.z*in_x.z + in_A.w*in_x.w; // 7 FLOPS
}
void A_times_x( float4& out_y, const …
Run Code Online (Sandbox Code Playgroud) 我有一个使用SSSE3内部命令的代码(注意三S)和运行时检查是否使用它,因此我假设应用程序应该在没有SSSE3支持的CPU上执行.但是,当使用-mssse3和-O1优化时,编译器还会插入我没有明确调用的SSSE3指令,因此程序崩溃.
有什么方法可以在我明确调用相关的内部函数时启用SSSE3代码,但是阻止编译器添加自己的SSSE3代码?
请注意,我无法禁用-O1优化.
我正在开发一个性能关键型应用程序,它必须移植到Intel Atom处理器,它只支持MMX,SSE,SSE2和SSE3.我以前的应用程序支持SSSE3以及AVX,现在我想将它降级到Intel Atom处理器(MMX,SSE,SSE2,SSE3).
当我更换ssse3指令时,特别是_mm_hadd_epi16
使用此代码,会严重降低性能
RegTemp1 = _mm_setr_epi16(RegtempRes1.m128i_i16[0], RegtempRes1.m128i_i16[2],
RegtempRes1.m128i_i16[4], RegtempRes1.m128i_i16[6],
Regfilter.m128i_i16[0], Regfilter.m128i_i16[2],
Regfilter.m128i_i16[4], Regfilter.m128i_i16[6]);
RegTemp2 = _mm_setr_epi16(RegtempRes1.m128i_i16[1], RegtempRes1.m128i_i16[3],
RegtempRes1.m128i_i16[5], RegtempRes1.m128i_i16[7],
Regfilter.m128i_i16[1], Regfilter.m128i_i16[3],
Regfilter.m128i_i16[5], Regfilter.m128i_i16[7]);
RegtempRes1 = _mm_add_epi16(RegTemp1, RegTemp2);
Run Code Online (Sandbox Code Playgroud)
这是我能够为这个特定指令提出的最佳转换.但这种变化严重影响了整个计划的表现.
任何人都可以在MMX,SSE,SSE2和SSE3指令中建议更好的性能效率替代_mm_hadd_epi16
指令.提前致谢.
我正在尝试使用来自的HMMlib库在c ++中处理一些隐藏的马尔可夫代码
http://www.cs.au.dk/~asand/?page_id=152
Run Code Online (Sandbox Code Playgroud)
我使用的是ubuntu 12.04,带有gcc/g ++ 4.6
我的编译步骤说明是:
g++ -I/usr/local/boost_1_52_0 -I../ MAIN.cpp
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
In file included from ../HMMlib/allocator_traits.hpp:25:0,
from ../HMMlib/hmm_table.hpp:25,
from MAIN.cpp:1:
/usr/lib/gcc/i686-linux-gnu/4.6/include/pmmintrin.h:32:3: error: #error "SSE3 instruction set not enabled"
In file included from ../HMMlib/hmm_table.hpp:25:0,
from MAIN.cpp:1:
../HMMlib/allocator_traits.hpp:50:33: error: ‘__m128d’ was not declared in this scope
../HMMlib/allocator_traits.hpp:50:40: error: template argument 2 is invalid
../HMMlib/allocator_traits.hpp:77:32: error: ‘__m128’ was not declared in this scope
../HMMlib/allocator_traits.hpp:77:38: error: template argument 2 is invalid
In file included from ../HMMlib/hmm_table.hpp:26:0,
from MAIN.cpp:1:
../HMMlib/operator_traits.hpp:112:32: error: ‘__m128d’ was …
Run Code Online (Sandbox Code Playgroud) 如果我的理解是正确的,
_mm_movehdup_ps(a)
给出与以下结果相同的结果
_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 3, 3))
?
两者在性能上有区别吗?
我有一个非常简单的程序,我正在努力提高性能.我知道的一种方法是帮助使用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)
我已经阅读了一些关于此的内容,并理解了这个想法,但我完全不知道如何实现这一点.有人可以帮帮我吗?我认为这很简单,特别是对于我的简单程序,但有时候入门是最难的部分.
谢谢!
sse3 ×10
sse ×6
c++ ×5
intrinsics ×3
simd ×3
optimization ×2
sse2 ×2
x86 ×2
atomic ×1
avx ×1
c ×1
gcc ×1
intel ×1
intel-atom ×1
matrix ×1
numa ×1
performance ×1
sse4 ×1