【问题标题】:Array organisation/data structure for multi-threading in CC中多线程的数组组织/数据结构
【发布时间】: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]);
  }
}

所以我的计划是使用ab 数组中的数字来计算cd 中的值。

我想在上面代码片段的末尾对循环进行多线程处理,而不会因内存访问而遇到速度问题。 - 我想拆分循环,以便不同的线程分别运行在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


    【解决方案1】:

    [2] 可能是最好的。

    多个线程对同一对象的不同步写入或写入和读取是数据竞争,这会导致未定义的行为。您可以添加锁定或原子性来避免这种情况,但通常会慢很多。所以 [1] 是不可接受的。即使线程访问数组的不同但附近的元素,由于缓存线乒乓,您可能会减慢速度。

    但是只要没有人在写,多个线程同时读取同一个对象是没有问题的。事实上,最好只拥有被读取对象的一份副本;它节省了内存和缓存空间。因此,[2] 比 [3] 更有效。

    【讨论】:

    • 感谢您的明确回答和有关“数据竞争”的警告。
    【解决方案2】:

    让多个线程读取相同的数据(只要没有写入)不是问题。

    如果一个线程负责更新c 而另一个线程负责更新d,您也不必担心写入。

    所以你有一个带有嵌套循环的线程来处理c,另一个线程有自己的嵌套循环来处理d。而且由于每个线程都在写入不同的数据集,因此您无需担心它们的同步。

    如果你这样做,[1] 很好。

    【讨论】:

    • 非常感谢,,.. 代码大纲是一个简化... a,b 索引为i,j 与指向c,d 的指针一起被发送到一个函数,索引为@987654328 @ 因为同时计算 c,d 效率最高.....所以我可以看到您的回答的逻辑,即根据最初陈述的问题,[1] 会很好,但是您已经提供了足够的信息明确 [2] 将是最好的。感谢您的明确答复。
    • 您的答案和@NateEldredge 的答案都是在 1 分钟内发布的,而且你们俩都写出了非常清晰的答案。多次刷新此页面后,我现在可以看到 Nate 刚刚发布 - 所以我将接受 Nate 的回答 - 但我也很乐意接受你的回答 - 抱歉,我只能接受一个,我有决定采用最先发布的答案,即使时间差不到一分钟。
    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 2014-06-22
    • 2015-12-16
    • 2015-05-07
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多