【发布时间】:2015-01-01 15:54:33
【问题描述】:
我正在使用 openmp 来并行化我的代码。我有一个原始数组:
A=[3,5,2,5,7,9,-4,6,7,-3,1,7,6,8,-1,2]
还有一个标记数组:
M=[1,0,1,0,0,0,1,0,0,1,1,0,0,0,1,1]
使用数组 M i 可以在这个打包数组中压缩我的原始数组:
A=[3,2,-4,-3,1,-1,2]
我想使用多线程方法来解决这个问题。 C++ 的库“推力”解决了这个问题,但我无法为 Fortran 找到类似的工具。 是否有一个库,比如 C++ 的“推力”,我可以用来执行流压缩? 或者,有没有一种我可以使用 fortran 和 openmp 自己编写的算法来解决这个问题?
【问题讨论】:
-
我认为你很难编写一个 OpenMP 程序来超越
A = pack(A,M==1)。我认为让多个线程写入A的开销将扼杀分配packing 工作的任何加速。但我期待被证明是错误的。 Thrust 如何解决问题? -
我可以而且也许应该在我之前的评论中添加我知道没有库可以在 Fortran 中实现
pack内在函数的并行版本。我想你可能会发现从 Thrust 调用 C++ 例程很容易。 -
如果您的向量非常长,您可以尝试在
OMP do循环中将其分成几块,并在每个子集上使用pack。您需要独立存储生成的子集并在最后合并它们。 -
首先,感谢您的回复。我不知道 Thrust 如何解决这个问题,但我读过这个库中有很多 API 在 GPU 应用程序的多线程中执行这些操作(减少、前缀和、重新排序等)。这里 (http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html) 似乎有必要进行并行前缀扫描,然后进行分散,但我不明白如何使用 openmp 在 fortran 中编写它。包内在函数是串行的,所以我不知道我是否可以通过大数组和大量线程(MIC 或 GPU)获得更好的性能。
-
我相信,没有证据证明,您的计算机在主机 RAM 和协处理器 RAM 之间移动非常大的阵列所花费的时间将超过并行化此
pack可能获得的任何好处荷兰国际集团运营。如果你走这条路,我很想看看你的结果。我认为您指向我们的 URL 中的大多数材料都显示了在 GPU 的 RAM 中获得数据后使用并行算法的优势,但是对于将数据转移到那里和转移回来所花费的时间相当腼腆。
标签: fortran openmp thrust prefix-sum stream-compaction