创建alignas(64)int的向量
Create vector of alignas(64) ints
我正在学习C++中的并行编程。我听说,如果访问一个共享向量,每个元素在内存中都对齐64字节,这对性能有好处,因为它减少了错误共享。
如何创建一个std::vector<int>
,其中向量中的每个元素都对齐64个字节?使用alignas(64) vector<int>
不会产生所需的效果,因为向量本身是由64个字节对齐的,而不是其中的每个元素。到目前为止,我找到的唯一解决方法是创建一个具有所需对齐方式的新结构。
struct alignas(64) int64
{
value;
int64(int a): value(a) {}
}
这个解决方案的问题是,我不能像使用普通int那样使用结构。因此,我必须调整整个代码以返回value
。
编辑:假设您想同时求和一个向量。一种可能性是创建计数器的共享向量,其中每个线程求和到其自己的空间中(例如通过thread_id)。当向量的每个元素都需要一条完整的捕获线时,错误共享(我认为)应该减少。然后,可以按顺序对得到的向量求和。这里有一个例子:
int false_share_sum(vector<int> &bigboy, int threads) {
vector<int> shared_counter(threads, 0); // here each int should be 64 byte
#pragma omp parallel for num_threads(threads)
for (auto iter = bigboy.begin(); iter < bigboy.end(); ++iter) {
shared_counter[omp_get_thread_num()] += *iter;
}
int sum = 0;
for (auto iter = shared_counter.begin(); iter != shared_counter.end(); ++iter)
{
sum += *iter;
}
return sum;
}
这正是std::hardware_destructive_interference_size
和std::hardware_constructive_interference_size
的用途。更多信息,请访问:https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size
#include <new>
struct AlignedInt {
alignas(std::hardware_destructive_interference_size) int value;
};
std::vector<AlignedInt> vec;
现在,如果你真的想这样做,那就另当别论了。确保衡量你的表现,并使用最适合你实际问题的方法。如果你没有破坏性的错误共享,你可能应该把它留给你的编译器/CPU。
相关文章:
- 函数中的默认"常量<int>向量 &id"参数
- 将彼此平行的两个 int 向量的元素求和
- 向量的向量 int 向量
- 通过 fstream 函数初始化 int 向量??C++
- 如何调用一个函数,该函数用一个int向量取几个int
- 重载 C++ 运算符>>,以便我可以读取向量(向量<int>向量;
- 如何定义包含int向量的sruct的少算子
- 如何使用具有 pair<int,int 向量的元素unordered_set>
- OpenCV C++:从存储在 int 向量的索引中为垫子类型数据创建列范围
- 如何在不复制的情况下将只读向量传递给作为<int> pair<int,int>向量一部分的函数
- 在C++中,将两个长度相同的int向量转换为一个成对的int向量
- 使用int向量的向量对int向量进行基数排序
- 如何移除包含int向量的结构的向量
- 将一串数字解析为int向量的最快方法
- 删除c风格的int向量数组
- 从对象打印2D int向量
- 如何从文件中取出整数并将它们放入int向量中?
- 为什么 std::transform 不将 std::string 向量转换为无符号的 int 向量?
- 用C++11从点的向量中创建一个int向量
- 对已转换为字符串的int向量进行排序