c - 如何高效定义一个128位常量?

标签 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 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位常量有什么更方便的表达方式吗?

最佳答案

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

  • 您知道要使用“MMX、SSE 和 SSE2 Intrinsics”,请单击该链接
  • 您知道要使用“Streaming SIMD Extensions 2”,请单击该链接
  • 下一个有吸引力的链接是“整数内存和初始化”,因为您不需要 float
  • 您将获得两个相关链接,Load 和 Set Operations
  • 加载只是让你得到你已经找到的那些

设置为金色,弹出 _mm_set1_epi16(短 w)

关于c - 如何高效定义一个128位常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10873600/

相关文章:

c - 当我从 C 文件中读取数字时,为什么会收到忽略返回值 ‘fscanf’ 的警告?

c# - 如何在 C# 项目中使用 Scintilla .NET?

java - 如何优化我的代码以在 Java 中高速生成伪随机字符串?

MySQL InnoDB 哈希索引优化

C lib直接从文件流中读取和解析JSON

c - 选择外部调用的特定寄存器

c - 为什么进程的内存分配很慢,可以更快吗?

c# - EF 6 不选择最近更新的值,除非我重建项目

visual-studio - Visual Studio 源代码控制集成如何与 Perforce 配合使用?

python - numexpr:临时变量或重复的子表达式?