gpt4 book ai didi

c++ - 使用指针的 vector 移位

转载 作者:太空宇宙 更新时间:2023-11-04 15:48:06 34 4
gpt4 key购买 nike

我正在使用 SSE3 优化我的代码。代码中有一点迫使我将 vector 中的所有元素移动一个元素

v[0] = 0   //v is some char* and N = v.size()
for(int i = 1;i<N;i++){
v[i] = v[i-1];
}

据我所知,SSE 不支持 vector 移位,因此我必须从头开始编写代码。

但后来我有了想法,如果我只是递减指针会怎么样。

v = (v-1); 
v[0] = 0;

这样,操作将是常量,根本不需要任何操作。

我已经测试过了,它适用于我的测试程序。
但是,我不确定此操作是否安全。

这真的是个愚蠢的想法吗?

最佳答案

SSE 确实支持移位,即 vector 内元素的按位移位以及整个寄存器沿字节边界的移位。

假设你的 vector 是 uint8_t 类型的 16 倍,你要找的操作是

psrldq xmm, 1      ;packed shift right logical double quad word

内在的

vec = _mm_srli_si128(vec, 1);   // shift by 1 byte

第一个问题:只要 v 是指向 char 的指针,递减或递增它就是完全安全的。取消引用可能不会,这取决于您的程序。

关于您的第二个问题:是的,这看起来是个愚蠢的想法。如果您尝试使用 SSE 进行优化并使用指向字节的指针执行某些任务,那么您很可能做错了什么,如果您尝试加载 16 个 vSSE 寄存器中 - 由于未对齐导致的段错误或由于强制编译器使用 movdqu 而导致的性能损失。

关于c++ - 使用指针的 vector 移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13411180/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com