【发布时间】:2021-06-21 18:48:18
【问题描述】:
我想在程序中添加多线程,这样我就可以通过运行两个或多个并发进程来通过循环来加速任务。
代码大纲(没有多线程)是
double * a, *b, *c, *d;
int n=10000;
int i, j;
a=(doube *)calloc(n, sizeof(double));
b=(doube *)calloc(n, sizeof(double));
c=(doube *)calloc(n, sizeof(double));
d=(doube *)calloc(n, sizeof(double));
setup(a, b); //routine to set the inital values of arrays a and b
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
if (i==j) continue;
c[i]+=func(a[i],a[j]); //calculation functions
d[j]+=func2(b[i],b[j]);
}
}
所以我的计划是使用a 和b 数组中的数字来计算c 和d 中的值。
我想在上面代码片段的末尾对循环进行多线程处理,而不会因内存访问而遇到速度问题。 - 我想拆分循环,以便不同的线程分别运行在i 范围的一部分。
我可以在这里看到三种可能的方式。
[1] 单个数组用于 a,b,c,d- 但由于两个线程试图同时写入相同的数字而导致潜在的冲突。
[2] 为a,b 创建单个数组,但为c, d 创建多个数组,以便每个线程有一个副本。因此,线程将全部从相同的数组a,b 中读取,但它们将写入不同的数组c,d 以避免可能的冲突-c,d 的这些多个数组将在所有线程完成后组合在一起
[3] a,b,c,d 的多个数组 - 每个数组的副本为每个不同的线程制作,因此没有读取或写入“冲突”,c,d 的多个数组将再次组合在一起线程结束了
我希望答案不是 [1],但非常感谢关于选项 [2] 或 [3] 是否更好的建议。 [3] 可能是最好的,但需要为每个线程复制 a,b 的输入数据的开销。
请注意,我搜索了类似的问题并发现了一些有用的东西(例如 Memory considerations with multithreading),但是我还没有找到这个问题的明确答案。
【问题讨论】:
标签: arrays c multithreading