|
|
1
2
第一种方法很简单。如果期望负载在螺纹上均匀平衡,这也足够了。在某些情况下,特别是如果bin_索引的复杂性非常依赖于参数值,则其中一个线程可能会比其他线程的任务更重。记住:任务在最后一个线程完成时完成。
请注意,将计算放在单独的线程中可能会有问题。当多个线程同时执行bin_索引时,请确保该索引正常工作。小心使用全局或静态变量来获得中间结果。 另外,“直方图[bin_index(i1,i2,i3,i4)]+=1”可能会被另一个线程中断,导致结果不正确(如果赋值获取值,将其递增并将结果值存储在数组中)。您可以为每个线程引入一个局部直方图,并在所有线程完成后将结果合并为一个直方图。您还可以确保在同一时间只有一个线程在修改直方图,但这可能会导致线程在大多数时间相互阻塞。 |
|
|
2
2
除非你真的看到你需要这个,否则不要开始让事情复杂化。同步问题(特别是在多线程而不是多进程的情况下)可能非常痛苦。 |
|
|
3
2
据我所知, OpenMP 虽然我不得不承认我自己还没有使用过它,但它只是为你正在尝试做的事情而设计的。基本上,它似乎可以归结为只包含一个标题并添加一个pragma子句。 你也可以用英特尔的 Thread Building Blocks 图书馆 |
|
|
4
2
在您的示例中,您只需添加以下pragma:
有了这个pragma,编译器将添加一些指令来创建线程,启动它们,在访问
当然,结果不应该是最优的,就好像你用手工编码一样。但如果您没有负载平衡问题,您可能会接近2倍的速度。实际上,这只是写在矩阵中,没有空间依赖关系。 |
|
|
5
1
这样你就不需要共享任何内存,直到结束。 |
|
|
6
0
如果您曾经在.NET中这样做,请使用 Parallel Extensions . |
|
|
7
0
如果您想编写多线程数字处理代码(将来您将要做很多),我建议您考虑使用像OCaml或Haskell这样的函数式语言。
|
|
|
8
0
您的单线程应用程序正在持续分配内存。要获得任何加速,您的几个线程还需要不断地分配给内存。如果一次只分配一个线程,您将不会得到任何加速。因此,如果你的作业受到保护,整个练习就会失败。 危险的 方法,因为您在没有保护的情况下分配给共享内存。但这似乎值得冒险(如果x2加速很重要的话)。如果可以确定bin_index(i1、i2、i3、i4)的所有值在循环的划分中都是不同的,那么它应该可以工作,因为数组分配将被分配到共享内存中的不同位置。尽管如此,我们还是应该认真研究这样的方法。
编辑:查看您的bin_索引(i1、i2、i3、i4),我怀疑您的流程如果不付出相当大的努力就无法并行化。
|
|
|
BlurKid · R中for循环时结果的奇怪差异 1 年前 |
|
|
bigjdawg43 · 迭代多个数据帧中的列并有条件地执行操作 1 年前 |
|
|
xhamsterIT · 循环VBA Microsoft Excel 1 年前 |
|
|
Nico44044 · 使用for循环遍历Django模型字段 1 年前 |
|
|
chanbo chung · 如何在聚合中获得所有可能的组合 1 年前 |
|
|
Himanshu · 无法在逐行二进制搜索中迭代2D数组中的所有行 1 年前 |
|
|
stephr · 循环为多个变量选择最接近另一个日期的日期 1 年前 |