Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在不使用填充的情况下防止错误共享_C_Parallel Processing_Pthreads_False Sharing - Fatal编程技术网

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

C 在不使用填充的情况下防止错误共享,c,parallel-processing,pthreads,false-sharing,C,Parallel Processing,Pthreads,False Sharing,我目前正在学习C中的pthreads,遇到了错误共享的问题。我想我理解它的概念,我也尝试过一些实验 下面是我一直在玩的一个简短的程序。最后我要把它变成一个程序,取一个大的整数数组,并行求和 #包括 #包括 #定义线程4 #定义NUMPAD 14 结构 { int total;//4字节 int my_num;//4字节 int pad[NUMPAD];//4*NUMPAD字节 }和_数组[4]; 静态void*worker(void*ind){ 常数int curr_ind=*(int*)ind

我目前正在学习C中的
pthreads
,遇到了错误共享的问题。我想我理解它的概念,我也尝试过一些实验

下面是我一直在玩的一个简短的程序。最后我要把它变成一个程序,取一个大的整数数组,并行求和

#包括
#包括
#定义线程4
#定义NUMPAD 14
结构
{
int total;//4字节
int my_num;//4字节
int pad[NUMPAD];//4*NUMPAD字节
}和_数组[4];
静态void*worker(void*ind){
常数int curr_ind=*(int*)ind;
对于(int i=0;i<10;++i){
求和数组[curr\u ind]。总计+=求和数组[curr\u ind]。我的数值;
}
printf(“%d\n”,和数组[curr\u ind].total);
返回NULL;
}
内部主(空){
int args[THREADS]={0,1,2,3};
pthread_t thread_id[线程];
用于(尺寸i=0;i
我的问题是,有没有可能在不使用填充的情况下防止虚假共享?此处
struct s
的大小为64字节,因此每个结构都位于其自己的缓存线上(假设缓存线为64字节)。我不知道如何在没有填充的情况下实现并行性


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

划分问题:在
worker()
中,求和到局部变量,然后将局部变量添加到数组中:

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;
}

<> >运行时在代码< > Prtff()/< > > /< P>中,线程的创建和同步绝对占主导地位。您也可以在GNU C或C++或OX-DEXSPEC(ALIGN(64))中使用
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;
}