gpt4 book ai didi

c - 使用 OpenMP 汇总数组元素对于大型数组 (C) 无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:56 24 4
gpt4 key购买 nike

我想围绕一个基本上汇总数组元素的 for 循环使用 OpenMP。为了比较,我还以串行方式总结了数组元素。对于大数组大小,array_size>=5795,总和不再相等。

这是 OpenMP 并行循环:

#pragma omp parallel for reduction(+:parallel_sum)
for (i = 0; i < array_size; i++) {
parallel_sum += array[i];
}

这是完整的代码:

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

int main() {
float *array, serial_sum, parallel_sum;
size_t array_size, i;

serial_sum = 0.;
parallel_sum = 0.;

#pragma omp parallel
printf( "number of threads used in parallized part: %d\n", omp_get_num_threads());

printf("enter size of array\n");
scanf("%zu", &array_size);

// memory allocation
array = (float *) malloc(sizeof(float) * array_size);

// initialize array
for (i = 0; i < array_size; i++)
array[i] = i;

// calculate the array sums, parallel first, then serial
#pragma omp parallel for reduction(+:parallel_sum)
for (i = 0; i < array_size; i++) {
parallel_sum += array[i];
}

for (i = 0; i < array_size; i++)
serial_sum = serial_sum + array[i];

if (serial_sum == parallel_sum)
printf("\nserial and parallel sums are equal\n");
else
printf("\nserial and Parallel sums are NOT equal\n");

// free memory
free(array);

return 0;
}

由于可以使用高斯求和公式轻松地手工计算和,sum = (n^2+n)/2,其中 n 对应于 array_size,因此两个求和都是错误的。 ..我想我有一些内存问题......?

最佳答案

由于浮点类型的精度有限,加法不是关联的(参见 Are floating point operations in C associative?Is Floating point addition and multiplication associative?)。

因此 a + (b + c) 可以评估不等于 (a + b) + c

在并行化/矢量化时,顺序操作确实不同于从低到高顺序添加数字。

如果您打印出计算值,您可能会发现它们在这种情况下非常接近,只是不完全相等。

关于c - 使用 OpenMP 汇总数组元素对于大型数组 (C) 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39611779/

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