Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何有效地定义128位常量?_C_Visual Studio_Optimization_Sse_Intrinsics - Fatal编程技术网

C 如何有效地定义128位常量?

C 如何有效地定义128位常量?,c,visual-studio,optimization,sse,intrinsics,C,Visual Studio,Optimization,Sse,Intrinsics,我正在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

我正在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
现在,我如何定义常数?以下两种方法都有效,但一种效率很低,另一种很难看

  • my_const\u 42=\u mm\u set\u epi16(42,42,42,42,42,42)
    -编译器生成8个命令来“构建”常量
  • my_const_42={42,0,42,0,42,0,42,0,42,0,42,0,42,0,42,0}
    -很难理解发生了什么;将
    42
    更改为例如
    -42
    并非易事

  • 有什么方法可以更方便地表达128位常量吗?

    90%的任务是找到正确的内在表达式。MSDN库组织得很好,从开始。从这里开始,像这样向下钻取:

    • 您知道要使用“MMX、SSE和SSE2内部函数”,请单击该链接
    • 如果您知道要使用“数据流单指令多数据扩展指令集2”,请单击该链接
    • 下一个有吸引力的链接是“整数内存和初始化”,因为您不需要浮点
    • 您将获得两个相关链接,加载和设置操作
    • Load只会让你找到你已经找到的

    集合是金色的,向外弹出
    \u mm\u set1\u epi16(短w)

    有关在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)
    

    也许对第二种方法使用宏是可以的