如何使用矢量类对 C++ 代码进行矢量化

How to vectorize c++ code using vector classes

本文关键字:代码 矢量化 C++ 何使用      更新时间:2023-10-16

我对SIMD很陌生,所以我在理解如何使用F32vec4等向量类并行操作数组时遇到了一些麻烦。

如果有人可以引导我完成这段代码正在做什么,我将不胜感激:

#include "fvec.h"
void add(float *a, float *b, float *c)    
{
    F32vec4 *av=(F32vec4 *) a;
    F32vec4 *bv=(F32vec4 *) b;
    F32vec4 *cv=(F32vec4 *) c;
    *cv=*av + *bv;
}

取自 这里

那么avbvcv是分别指向abcF32vec4类型的指针呢?

此外,如何访问cv元素并将其存储回常规浮点变量?

一般来说,

你不想访问cv的单个元素,如果你这样做,你只会使用c。也就是说,这是可能的。 F32vec4实际上只是一个包装器,__m128它是架构多媒体寄存器的内在变量类型。设置/获取这些寄存器的各个元素不是好的做法,因为这将是一个串行操作,并且违背了向量操作的目的。如果确实必须这样做,F32vec4的 [] 运算符是重载的;这会将内部寄存器强制转换为浮点数数组,并从/向数组的特定元素加载/存储一个元素。