小编Ste*_*eve的帖子

在GCC中编译SSE内在函数会产生错误

我的SSE代码在Windows平台上运行得很好,但是当我在Linux上运行时,我遇到了很多问题.其中一个是:

这只是我的代码的示例说明:

int main(int ref, int ref_two)

{

 __128i a, b;

a.m128i_u8[0] = ref;

b.m128i_u8[0]  = ref_two;

.

.


.

.....

}
Run Code Online (Sandbox Code Playgroud)

错误1:

错误:请求成员'm128i_u8'不是结构或联合

在这个线程中,它提供了使用适当的_mm_set_XXX内在函数而不是上述方法的解决方案,因为它只适用于Microsoft. SSE内在函数编译带有GCC错误的MSDN代码?

我尝试了我在程序中替换set指令的线程中提到的上述方法,但它严重影响了我的应用程序的性能.

我的代码很庞大,需要在2000个地方更改.所以我在寻找更好的替代方案,而不会影响我的应用程序的性能.

最近我从英特尔获得了这个链接,它说使用-fms-diaelect选项将它从Windows移植到Linux.

http://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-7A69898B-BDBB-4AA9-9820-E4A590945903.htm

有没有人尝试过上述方法?有没有人找到将大型代码移植到Linux的解决方案?


@Paul,这是我的代码,我已经放置了一个计时器来测量两种方法所花费的时间,结果令人震惊.

代码1:115毫秒(直接访问元素的Microsoft方法)

代码2:151 ms(使用设置指令)

当我在代码中使用set时,它花了我36毫秒.

注意:如果我在我的单个指令中替换它需要36毫秒,并想象如果我在我的程序中将它替换2000次,性能会降低.

这就是我寻找除设定指令之外的更好选择的原因

代码1:

__m128i array;
unsigned char* temp_src;
unsigned char* temp_dst;

for (i=0; i< 20; i++)

{

for (j=0; j< 1600; j+= 16)

 {
   Timerstart(&x);  
   array =  _mm_loadu_si128 ((__m128i *)(src));
   array.m128i_u8[0] =  36;
   y+ = Timerstop(x);
   _mm_store_si128( (__m128i *)temp_dst,array);

  }
 }
Run Code Online (Sandbox Code Playgroud)

代码2: …

x86 gcc sse intel simd

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

标签 统计

gcc ×1

intel ×1

simd ×1

sse ×1

x86 ×1