Questions tagged «multi-core»

3
单个线程如何在多个内核上运行?
我试图从高层次上理解单个线程如何跨多个内核运行。以下是我的最佳理解。我不认为这是正确的。 根据我对“ 超线程”的阅读,看来OS会组织所有线程的指令,使它们不会彼此等待。然后,CPU的前端通过向每个内核分配一个线程来进一步组织这些指令,并在任何打开周期之间分配来自每个线程的独立指令。 因此,如果只有一个线程,那么操作系统将不会进行任何优化。但是,CPU的前端将在每个内核之间分配独立的指令集。 根据https://stackoverflow.com/a/15936270,特定的编程语言可能会创建更多或更少的线程,但是在确定如何处理这些线程时这是无关紧要的。OS和CPU处理此问题,因此无论使用哪种编程语言,都会发生这种情况。 只是为了澄清一下,我要问的是在多个内核上运行一个线程,而不是在一个内核上运行多个线程。 我的摘要有什么问题?线程的指令在哪里以及如何划分到多个内核之间?编程语言重要吗?我知道这是一个广泛的主题;我希望对此有一个高层次的理解。

12
为什么程序需要特定数量的最小CPU内核?
当在内核数少于N的CPU上运行时,是否可以编写无法正常工作的代码(或完整的软件,而不是一段代码)?没有显式检查并故意失败: 如果(noOfCores <4)则没有故意运行 我正在查看游戏的最低系统要求(Dragon Age:Inquisition),它规定了至少四核CPU。许多玩家表示,它不能在两核CPU上运行,甚至不能在具有两个物理核和两个逻辑核的Intel Core i3上运行。而且这不是计算能力的问题。 据我了解,操作系统无法将线程与CPU完全隔离开来。 只是为了清除事情: 我不是在问:“我可以从代码中找出CPU内核的数量,并故意失败吗?” ...这样的代码是不正确的(迫使您购买更昂贵的CPU来运行程序-无需计算能力)。我要问的是,您的代码具有四个线程,并且当两个线程在同一物理核心上运行时会失败(而无需显式检查系统信息并有意地失败)。 简而言之,是否可以有需要多个核的软件,而又不需要来自多个核的额外计算能力?它仅需要N个单独的物理核心。

7
我是否应该不再使用不赞成使用的多线程和多处理器编程实践?
在FORTRAN和BASIC的早期,基本上所有程序都是使用GOTO语句编写的。结果是意大利面条代码,解决方案是结构化编程。 同样,指针可能很难控制我们程序中的特征。C ++从大量的指针开始,但是建议使用引用。像STL这样的库可以减少我们的依赖。还有一些习惯用法来创建具有更好特性的智能指针,并且某些版本的C ++允许引用和托管代码。 诸如继承和多态性之类的编程实践在幕后使用了许多指针(就像结构化编程生成充满分支指令的代码一样)。像Java这样的语言消除了指针,并使用垃圾回收来管理动态分配的数据,而不是依赖程序员来匹配其所有new和delete语句。 在我的阅读中,我看到了似乎不使用信号量的多进程和多线程编程的示例。他们是使用同一名称使用不同的名称还是使用新的方法来保护资源并发使用? 例如,使用多核处理器进行多线程编程的系统的特定示例是OpenMP。它代表以下一个关键区域,不使用信号量,该信号量似乎不包含在环境中。 th_id = omp_get_thread_num(); #pragma omp critical { cout << "Hello World from thread " << th_id << '\n'; } 本示例摘自:http : //en.wikipedia.org/wiki/OpenMP 或者,使用带有功能wait()和signal()的信号量对线程进行类似的保护,如下所示: wait(sem); th_id = get_thread_num(); cout << "Hello World from thread " << th_id << '\n'; signal(sem); 在此示例中,事情非常简单,只需简单的回顾就足以显示wait()和signal()调用是匹配的,即使有很多并发,也可以提供线程安全性。但是其他算法更复杂,并且使用多个信号量(二进制和计数),这些信号量分布在具有复杂条件的多个函数中,可以被许多线程调用。创建死锁或无法使线程安全的后果很难管理。 这些系统(例如OpenMP)是否消除了信号量的问题? 他们是否将问题转移到其他地方? 如何使用算法将自己喜欢的信号量转换为不再使用信号量?

2
如何在多核处理器上编程线程分配?
我想试验多核处理器上的线程,例如创建一个程序,该程序使用由两个不同处理器内核执行的两个不同线程。 但是,我不清楚线程在哪个级别分配给不同的内核。我可以想象以下情形(取决于操作系统和编程语言的实现): 线程分配由操作系统管理。线程是使用OS系统调用创建的,如果进程恰巧在多核处理器上运行,则OS会自动尝试在不同的内核上分配/调度不同的线程。 线程分配由编程语言实现管理。将线程分配给不同的内核需要特殊的系统调用,但是当我使用该语言的标准线程实现时,编程语言标准线程库会自动处理该问题。 线程分配必须明确编程。在我的程序中,我必须编写明确的代码来检测有多少个内核可用,并使用例如库函数将不同的线程分配给不同的内核。 为了使问题更具体,假设我已经在Windows或Linux上用Java或C ++编写了多线程应用程序。在多核处理器上运行时,我的应用程序会神奇地看到并使用多个内核吗(因为所有内容都由操作系统或标准线程库管理),还是我必须修改代码以了解多个内核?

8
我们应该为多核编程花费多少精力?
如今,处理器的核心越来越多,这让我感到奇怪。 程序员,我们是否应该适应这种行为,并在多核编程上投入更多的精力? 我们应该在多大程度上进行优化?线?亲和力?硬件优化?还有吗
12 multi-core 

2
有多少个使用线程?
当我在台式机/笔记本电脑上(重新)构建大型系统时,我告诉我make使用多个线程来加快编译速度,如下所示: $ make -j$[ $K * $C ] $C应该在哪里指示机器拥有的内核数量(我们可以假设它是一位数字),而根据我的心情,$K我从2到有所不同4。 因此,例如,我可能会说make -j12我是否有4个核心,这表示make要使用多达12个线程。 我的基本原理是,如果仅使用$C线程,则内核将在进程忙于从驱动器中获取数据时处于空闲状态。但是,如果我不限制线程数(即make -j),那我就有浪费时间切换上下文,耗尽内存或什至更糟的风险。假设计算机具有$M千兆内存($M大约为10)。 所以我想知道是否有一个确定的策略来选择运行效率最高的线程数。

6
并发中的下一个
在过去的一年中,我一直致力于Java并发方面的工作,并且已经构建并处理了许多并发包。因此,就并发世界的发展而言,我很有信心。此外,我非常有兴趣学习和了解有关并发编程的更多信息。 但是我无法回答自己下一步该怎么办?我应该学习或从事哪些额外工作,以继承更多与多核处理相关的技能。是否有与多核处理相关的好书(阅读并喜欢“实践中的并发性”和“ Java并发编程”)或与多核处理相关的资源,这样我就可以进入下一个级别了?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.