- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下双循环,我在其中计算矩阵 Fisher_M[FX][FY]
的元素。
我试图通过放置一个 OMP pragma #pragma omp parallel for schedule(dynamic, num_threads)
来优化它,但效果不如预期。
有没有一种方法可以使用 OpenMP(总和)进行归约以快速计算元素 Fisher_M[FX][FY]
?或者也许这可以通过 MAGMA 或 CUDA 实现?
#define num_threads 8
#pragma omp parallel for schedule(dynamic, num_threads)
for(int i=0; i<CO_CL_WL.size(); i++){
for(int j=0; j<CO_CL_WL.size(); j++){
if( CO_CL_WL[i][j] != 0 || CO_CL_WL_D[i][j] != 0){
Fisher_M[FX][FY] += CO_CL_WL[i][j]*CO_CL_WL_D[i][j];
}
}
}
最佳答案
您的代码在行 Fisher_M[FX][FY] += ...
处存在竞争条件。可以用reduce来解决:
double sum=0; //change the type as needed
#pragma omp parallel for reduction(+:sum)
for(int i=0; i<CO_CL_WL.size(); i++){
for(int j=0; j<CO_CL_WL.size(); j++){
if( CO_CL_WL[i][j] != 0 || CO_CL_WL_D[i][j] != 0){
sum += CO_CL_WL[i][j]*CO_CL_WL_D[i][j];
}
}
}
Fisher_M[FX][FY] += sum;
请注意,此代码受内存限制,计算量不大,因此并行化带来的性能增益可能小于预期(并且取决于您的硬件)。
Ps:为什么需要这个条件if( CO_CL_WL[i][j] != 0 || CO_CL_WL_D[i][j] != 0)
?如果其中任何一个为零,则总和不会改变。如果删除它,编译器可以生成更好的矢量化代码。
Ps2:在 schedule(dynamic, num_threads)
子句中,第二个参数是 block 大小而不是使用的线程数。我建议根据您的情况将其删除。如果您希望指定使用的线程数,请添加num_threads
子句或使用omp_set_num_threads
函数。
关于c++ - 使用 OpenMP 进行归约以计算矩阵元素的最终求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69584565/
我有一个需要映射/缩减的文件,其中输出需要总和和日期的最大值。我有总和部分的工作,但是,我不确定如何将最大日期作为减少的输出的一部分。 输入数据如下所示: ID1, ID2, date,
我必须为 C 的一个子集构建一个编译器。显然,因为这是我第一次做这样的事情,所以进展得不是很好。然而。我目前正在尝试为所述子集构建词法分析器和解析器。 我决定逐步构建它,并在出现错误时进行修复。所以我
我听说过很多关于 Map/Reduce 的内容,尤其是在 Google 大规模并行计算系统的背景下。到底是什么? 最佳答案 来自 Google 的摘要 MapReduce研究发表页面: MapRedu
我正在使用 JavaScript 原生 reduce,但是我想稍微改变分组以获得我想要的结果。我有一个数组如下: const people = [ {name: "John", age: 23,
我试图让一个简单的 map reduce 在 MongoVUE 中工作,但它没有返回任何结果,我只是想让它输出每个 userID 的计数,这样我就可以有一个工作示例来构建。 function Map(
我可能错了,但我见过的所有(?)Apache Hadoop 示例都将存储在本地文件系统上的文件作为输入(例如 org.apache.hadoop.examples.Grep) 有没有办法在 Hadoo
如何在 Swift 4 中以更优雅的方式完成类似以下的事情,例如使用 map 和/或 reduce。 为了在此处发布,我简化了代码,但请注意它确实需要使用索引。 var numbers = [50,
我是一名优秀的程序员,十分优秀!