- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 openmp 的新手,正在尝试了解它的结构..
这是我写的一个简单代码...(数字的平方)..
#include <omp.h>
#include <stdio.h>
#define SIZE 20000
#define NUM_THREADS 50
int main(){
int id;
int output[SIZE];
omp_set_num_threads(NUM_THREADS);
double start = omp_get_wtime();
#pragma omp parallel for
//{
//id = omp_get_thread_num();
for (int i=0; i<SIZE;i++){
id = omp_get_thread_num();
//printf("current thread :%d of %d threads\n", id, omp_get_num_threads());
output[i] = i*i;
}
//}
double end = omp_get_wtime();
printf("time elapsed: %f for %d threads\n", end-start, NUM_THREADS);
}
现在,改变线程数应该减少时间..但实际上它增加了时间?我做错了什么?
最佳答案
这很可能是由于您选择了要检查的问题。让我们看看您的并行循环:
#pragma omp parallel for
for (int i=0; i<SIZE;i++){
id = omp_get_thread_num();
output[i] = i*i;
}
您已指定 50 个线程并声明您有 16 个核心。
串行情况忽略 OMP 指令并且可以执行循环的积极优化。每个元素 i
都是 i*i
,一个简单的乘法,只依赖于循环索引。 id
可以完全优化掉。这可能会完全向量化,如果您的处理器是现代的,它可能可以在一条指令 (SIMD) 中执行 4 次乘法运算,这意味着对于 size=2000
,您正在查看 500 次 SIMD 乘法运算(没有数据获取开销和一个缓存友好的商店)。这将非常很快。
或者,让我们看看并行版本。您正在初始化 50 个线程——昂贵!。您正在引入许多上下文切换,因为即使您具有处理器亲和性,您也已经超额订阅了您的内核。 50 个线程中的每一个都将运行循环的 40 次迭代。如果幸运的话,编译器会稍微展开循环,这样它就可以执行 10 次 SIMD 乘法迭代。乘法,无论是否为 SIMD,仍然会很快。你最终得到的是相同数量的实际工作,所以每个处理器有 1/16 的工作,但是创建和销毁 50 个线程的开销创建的工作比并行增益更多。这是无法从并行化中获益的一个很好的例子。
您要做的第一件事是将线程数限制为实际核心数。将不必要的上下文切换添加到执行时间不会给您带来任何好处。多于内核的线程通常不会使其运行得更快。
你想做的第二件事是在你的循环中做一些更复杂的事情,并且做很多次(google for examples,有很多)。在构建工作循环时,您还需要牢记缓存性能,因为构建不当的循环不能很好地加速。
当您将工作更改为比线程开销、令人尴尬的并行和出色的缓存性能更复杂时,您可以开始看到 OpenMP 的真正优势。您要做的最后一件事是将您的循环从串行到 16 线程进行基准测试。例如:
关于c - 使用 openmp 看不到任何加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32163841/
我一直在尝试处理一个类项目,在该项目中我必须设置一个面向 GUI 的转换程序,并且我试图将数据从我的类的方法传递到 ActionListener,但监听器是告诉我文本字段不存在。它位于同一个包和类中,
我在服务器上有两个版本的 PHP(Centos 6.8) - 5.6 和 7.1 我的 Nginx 使用 php7.1,它不是默认的 PHP 解释器。 经过一番与 yum 的斗争后,我安装了 php7
我正在尝试为 BEAGLE 安装 OpenCL .首先,我下载了 intel_sdk_for_opencl_applications_2020.3.494.tar.gz 来自 here .然后我解压并
我想知道为什么我在 controlPanel 中看不到 topPanel 这是我的代码: import java.awt.BorderLayout; import java.awt.Color; im
在我的 urls.py 中,我有以下内容: urlpatterns = patterns('', # Examples: #url(r'^$', 'welcome_page.home'
非常感谢大家的帮助! 在 GetProductByID 下,我收到一条错误消息“int does not contain a definition for FirstOrDefault”。 using
1) 我已经通过 my computuer -> System variables; 设置了变量 CLASSPATH 2) 重新启动控制台并键入 echo %CLASSPATH%,CLASSPATH
我已经看过这篇文章了PHP doesn't see mysql extension ,但这对我没有帮助。 我使用: Windows Seven(在虚拟机中为 32 位,在真实电脑上为 64 位) 带
当我尝试通过输入 python3 来验证 Python3 是否可以看到 Django 时其次是 import django进入终端(这样我就可以打印 Django 的版本号),我得到以下错误: Tra
我已经使用 easy_install 安装了 pygraphviz但是当我启动 python 时出现错误: >>>import pygraphviz as pgv Traceback (most re
在向 Microsoft 报告之前,我想在这里问一下。我有一个问题,我无法看到我的 WinUI 3 应用程序的实时可视化树。我什至看不到应用程序内工具栏。我可以在 WPF 和 UWP 应用程序中看到,
我对缺乏基本的了解和 内。 我希望看到 39 个 svg 子元素,100 像素高,每个子元素中都有清晰的文本。 http://jsfiddle.net/pn5sj8ge/ 最佳答案 发生这种情况的原因
我正在尝试设置一个新的持续集成服务器,该服务器利用 Phing 和 PHPUnit 自动运行测试用例。 我已经用 Pear 安装了 Phing: pear channel-discover pear.
lua -e "print(package.path)" ./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib
我刚刚从 https://github.com/llvm/llvm-project.git 安装了 clang++ 和 libc++ .尝试运行时: clang main.cpp -stdlib=li
我一直在使用 Highstock 图表,我注意到当图表中有很多点时,无法使用工具提示查看最后一个点: 您可以看到工具提示显示了 5 月 9 日的点,而还有一个显示 5 月 10 日的点(正如您在范围选
This question already has answers here: error_log message is truncated when using print_r (5个答案) 1年前
我在编写 Selenium 测试来检查我的应用程序时遇到问题。我想测试的是,当用户输入正确的登录名/密码时,会显示正确的页面并且用户已登录。 主要问题是我的登录表单是作为 AngularJS 指令生成
我正在尝试在 Azure 服务上发布我的 ASP.NET Core 应用程序。这有效,但是当我尝试使用应用程序功能时,我收到消息 Your App Service app is up and runn
在我的 ionic 应用程序中,我有一个功能,用户应该在应用程序的导航栏中看到水平点线,单击它们,然后应该出现一个弹出菜单,其中包含两个菜单项(添加到收藏夹并添加评论)。下图说明了我的观点。 问题是这
我是一名优秀的程序员,十分优秀!