gpt4 book ai didi

c - 在不使用填充的情况下防止错误共享

转载 作者:行者123 更新时间:2023-12-02 03:26:00 24 4
gpt4 key购买 nike

我目前正在了解 pthreads在 C 中,遇到了错误共享的问题。我想我理解它的概念并且我尝试了一些尝试。

下面是我一直在玩的一个小程序。最终,我将把它改成一个程序,以获取大量整数并并行求和。

#include <stdio.h>
#include <pthread.h>

#define THREADS 4
#define NUMPAD 14

struct s
{
int total; // 4 bytes
int my_num; // 4 bytes
int pad[NUMPAD]; // 4 * NUMPAD bytes
} sum_array[4];

static void *worker(void * ind) {
const int curr_ind = *(int *) ind;
for (int i = 0; i < 10; ++i) {
sum_array[curr_ind].total += sum_array[curr_ind].my_num;
}
printf("%d\n", sum_array[curr_ind].total);
return NULL;
}

int main(void) {
int args[THREADS] = { 0, 1, 2, 3 };
pthread_t thread_ids[THREADS];

for (size_t i = 0; i < THREADS; ++i) {
sum_array[i].total = 0;
sum_array[i].my_num = i + 1;
pthread_create(&thread_ids[i], NULL, worker, &args[i]);
}

for (size_t i = 0; i < THREADS; ++i) {
pthread_join(thread_ids[i], NULL);
}
}

我的问题是,是否可以在不使用填充的情况下防止错误共享?这里 struct s具有 64 字节的大小,因此每个结构都位于自己的缓存行上(假设缓存行是 64 字节)。我不确定如何在没有填充的情况下实现并行性。

另外,如果我要对 1000-50,000 字节之间不同大小的数组求和,我如何防止错误共享?我可以使用类似的程序填充它吗?我目前的想法是将大数组中的每个 int 放入 struct s 的数组中。然后使用并行性对其进行求和。但是我不确定这是否是最佳解决方案。

最佳答案

分区问题:在worker() , sum 成局部变量,然后将局部变量添加到数组中:

static void *worker(void * ind) {
const int curr_ind = *(int *) ind;
int localsum = 0;
for (int i = 0; i < 10; ++i) {
localsum += sum_array[curr_ind].my_num;
}
sum_array[curr_ind].total += localsum;
printf("%d\n", sum_array[curr_ind].total);
return NULL;
}

这可能在循环后仍然存在错误共享,但每个线程一次。线程创建开销比单个缓存未命中要重要得多。当然,您可能希望有一个实际执行一些耗时操作的循环,因为您当前的代码可以优化为:
static void *worker(void * ind) {
const int curr_ind = *(int *) ind;
int localsum = 10 * sum_array[curr_ind].my_num;
sum_array[curr_ind].total += localsum;
printf("%d\n", sum_array[curr_ind].total);
return NULL;
}

其中运行时肯定以 printf()中的线程创建和同步为主。 .

关于c - 在不使用填充的情况下防止错误共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30284402/

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