c - 并行和顺序点积程序不同的结果

标签 c linux parallel-processing pthreads

我编写了这两个版本的代码来计算两个数组的点积运算。每个长度都是256。这是非常简单的顺序代码:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[]){
    double sum;
    double a[256], b[256];
    int n = 256, i;
    for (i=0; i<n; i++){
        a[i] = i * 0.5;
        b[i] = i * 2.0; 
    }
    sum = 0;
    for (i=1; i<=n; i++){
        sum = sum + a[i]*b[i];
    }
    printf ("sum = %f\n", sum);
}//main

答案是 5559680

但是并行代码:

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

#define NUMTHRDS 4

double sum;
double a[256], b[256];
int status;
int n=256;
pthread_t thds[NUMTHRDS];
pthread_mutex_t mutexsum;

void* dotprod(void *arg){
    int myid, i, my_first, my_last;
    double sum_local;

    myid = (int)arg;
    my_first = myid * n/NUMTHRDS;
    my_last = (myid + 1) * n/NUMTHRDS;

    sum_local = 0;
    for (i=my_first; i<=my_last; i++){
        sum_local = sum_local + a[i]*b[i];
    }

    pthread_mutex_lock(&mutexsum);
    sum = sum + sum_local;
    pthread_mutex_unlock(&mutexsum);

    pthread_exit((void*)0);
}//dotprod

int main(int argc, char* argv[]){
    int i;
    pthread_attr_t attr;
    for (i=0; i<n; i++){
        a[i] = i * 0.5;
        b[i] = i * 2.0;
    }

    pthread_mutex_init(&mutexsum, NULL);
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    for (i=0; i<NUMTHRDS; i++){
        pthread_create(&thds[i], &attr, dotprod, (void*)i);
    }

    pthread_attr_destroy(&attr);

    for(i=0; i<NUMTHRDS; i++){
        pthread_join(thds[i], (void **)&status);
    }

    printf("sum = %f \n", sum);
    pthread_mutex_destroy(&mutexsum);
    pthread_exit(NULL);

    return 0;   
}//main

答案是 5617024

我完全搞不懂这种区别是什么?

最佳答案

因一个错误而关闭。

for (i=1; i<=n; i++){

for (i=0; i<n; i++) {

for (i=my_first; i<=my_last; i++){

for (i=my_first; i<my_last; i++){

在第一个程序中,您添加了数组末尾的 a[256] 和 b[256]。 这些值很可能为 0,因此您得到了正确的答案。

在第二个程序中,您对数组的某些部分进行了两次计数:64、128、192 和 仍在添加索引 256。

始终检查循环的边界条件,尤其是数组访问。

关于c - 并行和顺序点积程序不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20708184/

相关文章:

linux - 为什么在 Linux/Ubuntu 中支持硬件加速 Canvas (html) 需要这么长时间? (火狐/ Chrome )

r - 由于依赖关系,安装 devtools 失败,但依赖关系不适用于我拥有的 R 版本

.net - 在 ubuntu 18.4 上为 .net 应用程序创建服务期间出错。可执行路径不是绝对的 :

c++ - 并行循环中的惰性 vector 访问

python - Python 中多处理的同步问题,双 for 循环

c - 使用 net-snmp C API 设置值时出现问题

c - 为什么命令行参数声明会导致段错误

c - 将文本文件读取到 C 中的行数组中

c - NetBeans 中的 .c 文件集合及其 main()

parallel-processing - 如何在 Mathematica 8 中并行化积分