![]() |
1
2
首先,用户的高性能标记在他的评论中是正确的。如果循环索引值依赖于计算值,则不应使用折叠。在您的示例中,“j”依赖于“max”,这将产生不正确的结果。但是,这并不是造成分割错误的原因。 我建议您调试您的示例,以便找到崩溃的根源;默认情况下,“max”被初始化为负数,这导致“j”也具有所述值。因此,当试图访问数组[i*Alth+(-2147483648)]时,会得到分割错误。 这是因为openmp为每个reduction操作符指定了一个初始值。在这种情况下 最大算子 ,您可以在 specification of OpenMP 3.1 :
在我们的例子中,这意味着每个线程将在并行区域的开始处拥有最大值的私有副本,该最大变量保存可以作为int(通常为2147483648)存储的最低数量的值。 我已经为你的例子写了一个非常简单的解决方案。我删除了折叠子句,在并行区域开始时,我手动初始化max变量:
作为额外的评论,你不需要每次使用max = j。您可以尝试检查找到第一个0的时间并使用前一个位置。 希望有帮助 |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 5 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 5 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 6 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 6 月前 |