问题标签 [sse2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 用 C++ 实现 SIMD
我正在编写一些代码,并试图尽可能地优化它,基本上让它在一定的时间限制下运行。
以下是调用...
...以下是执行的内容。
我正在使用英特尔的 TBB 来优化它。但我也一直在阅读有关 SIMD 和 SSE2 以及类似性质的内容。所以我的问题是,如何将变量 (i,j,k) 存储在寄存器中,以便 CPU 可以更快地访问它们?我认为答案与实施 SSE2 或它的一些变体有关,但我不知道如何做到这一点。有任何想法吗?
编辑:这将在 Linux 机器上运行,但我相信使用英特尔的编译器。如果有帮助,我必须在执行任何操作以确保编译器工作之前运行以下命令... source /opt/intel/Compiler/11.1/064/bin/intel64/iccvars_intel64.csh; source /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh ...然后编译我做: icc -ltbb test.cxx -o test
如果没有简单的方法来实现 SSE2,关于如何进一步优化代码的任何建议?
谢谢, 赫里斯托
c - 逻辑 SSE 内在函数之间有什么区别?
不同类型的逻辑 SSE 内在函数之间有什么区别吗?例如,如果我们进行 OR 运算,则有三个内在函数:_mm_or_ps
,它们_mm_or_pd
都_mm_or_si128
做同样的事情:计算它们的操作数的按位或。我的问题:
使用一个或另一个内在函数(使用适当的类型转换)有什么区别。在某些特定情况下会不会有任何隐性成本,例如更长的执行时间?
这些内在函数映射到三个不同的 x86 指令 (
por
,orps
,orpd
)。有谁知道为什么英特尔将宝贵的操作码空间浪费在几条做同样事情的指令上?
python - numpy 通过 ctypes 调用 sse2
简而言之,我试图从 python 调用一个共享库,更具体地说,是从 numpy 调用。共享库是在 C 中使用 sse2 指令实现的。启用优化,即使用 -O2 或 -O1 构建库时,我在通过 ctypes 调用共享库时遇到了奇怪的段错误。禁用优化 (-O0),一切都按预期进行,就像将库直接链接到 c 程序时一样(优化与否)。附上你会发现一个片段,它展示了我系统上的描述行为。启用优化后,gdb 会在 emmintrin.h:113 的 __builtin_ia32_loadupd (__P) 中报告段错误。__P 的值被报告为优化。
测试.c:
编译器标志: gcc -o libtest.so -shared -std=c99 -msse2 -fPIC -O2 -g -lm test.c
测试.py:
从 C 调用 test 按预期工作:
call_from_c.c:
编译调用:
gcc -std=c99 -otestc -msse2 -L。-ltest call_from_c.c
导出 LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:.
./testc
... 有效。
我的系统:
- Ubuntu Linux i686 2.6.31-22-generic
- 编译器:gcc (Ubuntu 4.4.1-4ubuntu9)
- Python:Python 2.6.4(r264:75706,2009 年 12 月 7 日,18:45:15)[GCC 4.4.1]
- 麻木:1.4.0
我已经采取了规定(参见python代码)y是对齐的并且x的对齐应该无关紧要(我认为;虽然明确对齐x并不能解决问题)。
另请注意,我在加载 b 和 f 时使用 _mm_loadu_pd 而不是 _mm_load_pd。对于 C-only 版本 _mm_load_pd 工作(如预期)。但是,当使用 _mm_load_pd 通过 ctypes 调用函数时,总是会出现段错误(与优化无关)。
我已经尝试了几天来解决这个问题但没有成功......而且我正处于将我的显示器殴打致死的边缘。欢迎任何输入。丹尼尔
floating-point - x87 中的扩展(80 位)双浮点,而不是 SSE2 - 我们不会错过吗?
我今天正在阅读有关研究人员发现 NVidia 的 Phys-X 库使用 x87 FP 与 SSE2的文章。显然,这对于速度胜过精度的并行数据集来说不是最理想的。但是,文章作者继续引用:
英特尔在 2000 年底推出 P4 后开始不鼓励使用 x87。自 2003 年 K8 以来,AMD 弃用了 x87,因为 x86-64 是在 SSE2 支持下定义的;威盛的 C7 自 2005 年起就支持 SSE2。在 64 位版本的 Windows 中,x87 在用户模式下被弃用,在内核模式下完全被禁止。自 2005 年以来,业内几乎所有人都推荐 SSE 而不是 x87,并且没有理由使用 x87,除非软件必须在嵌入式 Pentium 或 486 上运行。
我想知道这一点。我知道 x87 在内部使用 80 位扩展双精度来计算值,而 SSE2 没有。这对任何人都没有关系吗?这对我来说似乎很奇怪。我知道当我对平面中的点、线和多边形进行计算时,在进行减法时值可能会出乎意料地错误,并且由于缺乏精度,区域可能会塌陷并且线会相互混叠。我想,使用 80 位值与 64 位值会有所帮助。
这是不正确的吗?如果没有,如果 x87 被淘汰,我们可以使用什么来执行扩展的双 FP 操作?
.net - 带 /CLR 开关的 SSE2 指令支持
为什么 SSE2 增强指令集优化不适用于使用 /clr 开关编译的 C++ 程序?
c - 如何使用 SSE 内在函数将值存储在不连续的内存位置?
我对 SSE 很陌生,并且使用内在函数优化了一段代码。我对操作本身很满意,但我正在寻找一种更好的方法来编写结果。结果以三个_m128i
变量结束。
我想要做的是将结果值中的特定字节存储到非连续的内存位置。我目前正在这样做:
其中y
、cb
和cr
是字节 ( unsigned char
) 数组。由于我无法定义的原因,这对我来说似乎是错误的。有人对更好的方法有任何建议吗?
谢谢!
c - 使用 SSE2 指令集查找 3 个值的中位数
我的输入数据是 16 位数据,我需要使用 SSE2 指令集找到 3 个值的中位数。
如果我有 3 个 16 位输入值 A、B 和 C,我想这样做:
我打算使用的 C 函数是:
- 最大值 - _mm_max_epi16
- 分钟 - _mm_min_epi16
- 添加 - _mm_add_epi16
- 减去 - _mm_sub_epi16
任何人都可以提出更好的方法吗?
c++ - 如何优化一个循环?
我有以下瓶颈功能。
我想C++
用 SSE2 内部函数替换代码。我已经尝试过_mm_cmpgt_epi8
,但它使用了签名比较。我需要无符号比较。
有什么技巧(SSE、SSE2、SSSE3)来解决我的问题吗?
注意: 在这种情况下,我不想使用多线程。
assembly - 在汇编中将无符号字符转换为浮点数(为浮点向量计算做准备)
我正在尝试使用 SSE2 优化功能。我想知道我是否可以比这种方式更好地为我的汇编代码准备数据。我的源数据是一堆来自 pSrcData 的无符号字符。我将它复制到这个浮点数组中,因为我的计算需要在浮点数中进行。
我有没有更快的方法将 pSrcData 的每个其他字节转换为浮点数并将其存储到 vVectX 中?
谢谢!
c++ - boost::shared_array 和对齐的内存分配
在 Visual C++ 中,我试图动态分配一些 16 字节对齐的内存,以便我可以使用需要内存对齐的 SSE2 函数。现在这就是我分配内存的方式:
boost::shared_array aData(new unsigned char[GetSomeSizeToAllocate()]);
我知道我可以使用 _aligned_malloc 来分配对齐的内存,但是当它试图释放我的内存时,这会导致 boost 出现问题吗?这是 boost 用于释放内存的代码:
删除释放的内存必须分配新的,对吗?关于如何解决这个问题的任何提示?