gpt4 book ai didi

C++ 缓存友好方式访问 `vector ` 的所有元素的所有成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:25 25 4
gpt4 key购买 nike

我有兴趣针对多线程计算优化我的代码。在缓存、流水线或内存访问的任何其他方面,以下比较如何节省这些资源:

案例一

struct something{
float a;
float b;
int c;
bool d;
};

vector <something> vec(n, something());

for(int q=0; q<n; q++)
{
vec[q].a = expression1;
vec[q].b = expression2;
vec[q].c = expression3;
vec[q].d = expression4;
}

案例二

struct something{
float a;
float b;
int c;
bool d;
};

vector <something> vec(n, something());

for(int q=0; q<n; q++)
vec[q].a = expression1;
for(int q=0; q<n; q++)
vec[q].b = expression2;
for(int q=0; q<n; q++)
vec[q].c = expression3;
for(int q=0; q<n; q++)
vec[q].d = expression4;

案例三

vector <float> a(n);
vector <float> b(n);
vector <int> c(n);
vector <bool> d(n);

for(int q=0; q<n; q++)
a[q] = expression1;
for(int q=0; q<n; q++)
b[q] = expression2;
for(int q=0; q<n; q++)
c[q] = expression3;
for(int q=0; q<n; q++)
d[q] = expression4;

此外,是否有更好的方法来解决上述问题?

最佳答案

  • 案例 1 可读性最强。
  • 案例 1案例 3 同样是缓存友好的。两者都只对所有数据进行一次传递。*
  • 情况 2 是最糟糕的,因为它对数据进行了 4 次传递 - 每次传递仅接触一个元素。

如果所有结构字段都不同,则案例 3 具有可能可向量化的巨大优势,而案例 1 则没有。

这是因为情况 3数组结构 打包,它将所有相同的数据类型按顺序放在内存中 - 因此公开矢量化。

编辑:

*情况 3 可能比情况 1 对缓存更友好,因为它不需要结构填充 - 因此数据大小更小。

关于C++ 缓存友好方式访问 `vector <struct_type>` 的所有元素的所有成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8292626/

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