【问题标题】:How to define a 128-bit constant efficiently?如何有效地定义一个 128 位常量?
【发布时间】:2012-06-08 01:42:48
【问题描述】:

我正在使用 MS Visual Studio 中的 SSE2 指令集。我正在使用它对 16 位数据进行一些计算。

假设我有 8 个值加载到 SSE 寄存器中。我想为所有这些添加一个常量(例如42)。这是我希望我的代码看起来的样子。

__m128i values; // 8 values, 16 bits each
const __m128i my_const_42 = ???; // What should i write here?
values = _mm_add_epi16(values, my_const_2); // Add 42 to the 8 values

现在,我该如何定义常量?以下两种方式可行,但一种效率低,另一种难看。

  1. my_const_42 = _mm_set_epi16(42, 42, 42, 42, 42, 42, 42, 42) - 编译器生成 8 个命令来“构建”常量
  2. my_const_42 = {42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0} - 很难理解发生了什么;将 42 更改为例如-42 不是小事

有没有什么方法可以更方便的表达128位常量?

【问题讨论】:

  • 或许用宏来做第二种方法是可以的

标签: c visual-studio optimization sse intrinsics


【解决方案1】:

百分之九十的战斗是在寻找正确的内在。 MSDN 库组织得很好,从this page 开始。从那里,像这样向下钻取:

  • 您知道要使用“MMX、SSE 和 SSE2 Intrinsics”,请点击该链接
  • 您知道要使用“流式 SIMD 扩展 2”,请点击该链接
  • 下一个吸引人的链接是“整数内存和初始化”,因为您不需要浮点数
  • 您将获得两个相关链接,加载和设置操作
  • 加载只会让你找到你已经找到的那些

设置是金色的,弹出_mm_set1_epi16 (short w)

【讨论】:

    【解决方案2】:

    关于在 SSE(或 NEON)中创建常量的注意事项。与指令执行相比,从内存加载数据非常慢。如果您需要一个可以通过代码创建的常量,那么这是更快的选择。以下是通过代码创建的一些常量示例:

     xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF
     xmmTemp = _mm_slli_epi16 (mmxTemp, 7); // now it has 0xFF80 (-128)
    
     xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF
     xmmTemp = _mm_slli_epi16 (mmxTemp, 15); // 0x8000
     xmmTemp = _mm_srli_epi16 (mmxTemp, 11); // 0x10 (positive 16)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2012-02-19
      • 2011-12-21
      • 2013-04-30
      相关资源
      最近更新 更多