RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1406263
Accepted
Optimus1
Optimus1
Asked:2022-07-04 00:45:23 +0000 UTC2022-07-04 00:45:23 +0000 UTC 2022-07-04 00:45:23 +0000 UTC

SIMD - 如何从相同类型的2个向量中添加值

  • 772

请告诉我如何从相同类型的向量中添加值,但这些值本身被这些向量中不同数量的字节占用。

这是一个例子:

int main()
{
    //--------------------------------------------------------------
    int my_int_sequence[16] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };


    __m128i my_int_sequence_m128i_1 = _mm_loadu_si128((__m128i*) & my_int_sequence[0]);
    __m128i my_int_sequence_m128i_2 = _mm_loadu_si128((__m128i*) & my_int_sequence[4]);
    __m128i my_int_sequence_m128i_3 = _mm_loadu_si128((__m128i*) & my_int_sequence[8]);
    __m128i my_int_sequence_m128i_4 = _mm_loadu_si128((__m128i*) & my_int_sequence[12]);
    //--------------------------------------------------------------



    //-----------------------------------------------------------------------
    char my_char_mask[16] = { 1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,1 };

    __m128i my_char_mask_my_m128i = _mm_loadu_si128((__m128i*) &my_char_mask[0]);
    //-----------------------------------------------------------------------

}

也就是说,我在 my_int_sequence 数组中有一个 int 值数组——并且由于所有 16 个 int 值都无法放入一个 __m128i 向量中,因此我将这些值 4 个值加载到第 4 个 __m128i 向量中。

我还有一个 16 字节的数组,我也将它加载到 my_char_mask_my_m128i 向量中。

现在我想添加到 my_int_sequence_m128i_x 向量的每个 4 字节值,就好像来自 my_char_mask_my_m128i 向量的相应一字节值一样。

问题显然是我需要把不同的维度加起来。可能吗?

也许我需要向量 my_char_mask_my_m128i 的每个字节 - 如何将其转换为 4 个字节?

c++ c
  • 1 1 个回答
  • 51 Views

1 个回答

  • Voted
  1. Best Answer
    LShadow77
    2022-07-04T05:28:20Z2022-07-04T05:28:20Z

    我看到你已经部分回答了:这个 SIMD 指令是做什么的?.

    但我仍然建议在这里使用它_mm_cvtepi8_epi32,因为签名int和签名在这里加起来char。

    原理很简单:展开char为int,相加,掩码右移4个字节。等4次。

    #include <stdio.h>
    #include <x86intrin.h>
    
    void show_sequence(const char* pstrMsg, int* pSeq);
    void show_mask(const char* pstrMsg, char* pMask);
    
    int main()
    {
        int my_int_sequence[16] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
        char my_char_mask[16] = { 1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,1 };
        
        show_sequence("Source sequence", my_int_sequence);
        show_mask(    "Characters mask", my_char_mask);
        
        __m128i my_int_sequence_m128i_1 = _mm_loadu_si128((__m128i*)&my_int_sequence[0]);
        __m128i my_int_sequence_m128i_2 = _mm_loadu_si128((__m128i*)&my_int_sequence[4]);
        __m128i my_int_sequence_m128i_3 = _mm_loadu_si128((__m128i*)&my_int_sequence[8]);
        __m128i my_int_sequence_m128i_4 = _mm_loadu_si128((__m128i*)&my_int_sequence[12]);
        
        __m128i my_char_mask_my_m128i = _mm_loadu_si128((__m128i*)my_char_mask);
        
        my_int_sequence_m128i_1 = _mm_add_epi32(my_int_sequence_m128i_1, _mm_cvtepi8_epi32(my_char_mask_my_m128i));
        
        my_char_mask_my_m128i = _mm_bsrli_si128(my_char_mask_my_m128i, 4);
        my_int_sequence_m128i_2 = _mm_add_epi32(my_int_sequence_m128i_2, _mm_cvtepi8_epi32(my_char_mask_my_m128i));
        
        my_char_mask_my_m128i = _mm_bsrli_si128(my_char_mask_my_m128i, 4);
        my_int_sequence_m128i_3 = _mm_add_epi32(my_int_sequence_m128i_3, _mm_cvtepi8_epi32(my_char_mask_my_m128i));
        
        my_char_mask_my_m128i = _mm_bsrli_si128(my_char_mask_my_m128i, 4);
        my_int_sequence_m128i_4 = _mm_add_epi32(my_int_sequence_m128i_4, _mm_cvtepi8_epi32(my_char_mask_my_m128i));
        
        _mm_store_si128((__m128i*)&my_int_sequence[0], my_int_sequence_m128i_1);
        _mm_store_si128((__m128i*)&my_int_sequence[4], my_int_sequence_m128i_2);
        _mm_store_si128((__m128i*)&my_int_sequence[8], my_int_sequence_m128i_3);
        _mm_store_si128((__m128i*)&my_int_sequence[12], my_int_sequence_m128i_4);
        
        show_sequence("Result sequence", my_int_sequence);
        return 0;
    }
    
    
    void show_sequence(const char* pstrMsg, int* pSeq)
    {
        printf("%s: {", pstrMsg);
        for (char i=0; i<15; ++i)
            printf("%2d, ", pSeq[i]);
        printf("%2d}\n", pSeq[15]);
    }
    
    void show_mask(const char* pstrMsg, char* pMask)
    {
        printf("%s: {", pstrMsg);
        for (char i=0; i<15; ++i)
            printf("%2d, ", (int)pMask[i]);
        printf("%2d}\n", (int)pMask[15]);
    }
    

    Source sequence: { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15}
    Characters mask: { 1,  0,  1,  1,  0,  1,  0,  1,  1,  1,  0,  1,  0,  1,  0,  1}
    Result sequence: { 1,  1,  3,  4,  4,  6,  6,  8,  9, 10, 10, 12, 12, 14, 14, 16}
    
    • 6

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5