- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 OpenMP 并尝试使用大小为 n 的表获取算法前缀和的跨度 log(n)。对于表格的每个单元格,我都有表格所有先前值的总和。
在我得到的解决方案中,有一个循环我无法并行化,我正在使用循环中的 n 个线程的数量来处理数组 T 的每个单元格(所以线程号 i 在 T[i] 上工作)。
编辑:这里是顺序算法,用于对包含 n 个单元格的表 T 执行此操作。
prefix_sum(int ** T, int n)
{
for(i = 2; i <= n; i *= 2) // this loop cannot be parallelized
{
for (l=1; l <= n/i; l++) // this loop can be parallelized
{
T[l*i - 1] += T[l*i - i/2 - 1];
}
}
for(i = n/2; i >= 2; i /= 2) // this loop cannot be parallelized
{
for (l = 1; l < n/i; l++) // this loop can be parallelized
{
T[i*l + i/2 - 1] += T[i*l - 1];
}
}
}
return T;
}
我想避免像这样对每个循环进行编码:
#pragma omp single
{
for (i=2; i <= n; i*=2)
{
#pragma omp parallel num_threads(n)
{
if ((omp_get_thread_num() % i) == (i - 1))
{
T[omp_get_thread_num()] += T[omp_get_thread_num() - i/2];
}
}
}
}
因为 openMP 规范通知为每个 #pragma omp parallel 创建线程组,我丢失了 log(n) 的跨度。在这段代码中,我有一个 log^2(n) 的跨度来创建线程。因此,我尝试像这样进行每个循环:
omp_set_num_threads(8); //this is a test code with 8 threads
#pragma omp parallel
{
for (i = 0; i < 8; ++i)
{
printf("iteration : %d\n", i);
#pragma omp barrier
}
}
for 循环的每一步都必须按顺序执行,因此我们的想法是将它们与 n 个线程并行化,并让所有线程在循环的每一步结束时使用屏障等待。
但似乎障碍正在阻止并行性。执行显示:
iteration : 0
iteration : 0
iteration : 0
iteration : 0
iteration : 0
iteration : 0
iteration : 0
iteration : 0
iteration : 1
iteration : 2
iteration : 3
iteration : 4
iteration : 5
iteration : 6
iteration : 7
^C <- the program loops infinitely...
似乎只有一个线程在第一个屏障之后执行循环。根据 openMP 规范,遇到的工作共享区域和屏障区域的顺序对于团队中的每个线程都必须相同,并且此程序遵守此限制。
所以我想知道是否有人知道如何让线程在循环的每一步都等待其他线程。
最佳答案
在您的代码中,循环迭代器 i
是无意中共享的;
#pragma omp parallel
应该是
#pragma omp parallel private(i)
关于c - OpenMP : Creating threads, 并行性,循环障碍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26568373/
我正在尝试从标准输入中获取一行。据我所知,我们永远不应该使用gets的手册页中所说的gets: Never use gets(). Because it is impossible to tell w
很多问题SO和文章/书籍,例如https://mirrors.edge.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.201
我认为 Coffeescript 是一门很棒的语言!我正在寻找一些将静态分析添加到 Coffeescript 的项目/问题/功能。然而,经过一番搜索后,我发现 Coffeescript faq和 th
以下查询返回过去 12 个月(针对特定客户)每周的订单总量: SELECT DATEPART(year, orderDate) AS [year], DATEPART(month, or
我觉得这可能是一个错误,任何人都可以重现或看到我做事方式的一些错误。 我正在尝试将 GKPolygonObstacle 添加到 iOS 或 macOS Playground 中的 GKMeshGrap
我的 SKSpriteKit 应用程序中有一个单独的“Floor”类。当我第一次创建这个类时,我使用 在整个框架周围设置了一个屏障 self.physicsBody = SKPhysicsBody(e
我有我正在尝试建模的半连续数据(许多精确的零和连续的正结果)。我从 Zuur 和 Ieno 的 R 中零膨胀模型初学者指南中学到了大量关于零质量的建模数据,它区分了零膨胀 Gamma 模型和他们所描述
以下代码实现了一些无锁(且无原子!)的线程间通信,这些通信需要使用存储和加载内存屏障,但是C++ 11 release-acquire语义不适当,也不保证正确性。实际上,该算法暴露了对发布获取语义的某
我指的是在 https://developer.android.com/training/constraint-layout/index.html#constrain-to-a-barrier 上使用
我正在一个非常好的 IBM x 服务器(4 个 8 核 CPU)上运行一些模拟应用程序的 x64 版本。操作系统是 Linux - redhat 5.6 x64 内核。因此,此应用恰好在需要超过 2
我是一名优秀的程序员,十分优秀!