只是好奇知道哪些CPU架构支持比较和交换原子基元?
另一周,我写了一个小线程类和一个单向消息管道,以允许线程之间的通信(每个线程两个管道,显然,用于双向通信).在我的Athlon 64 X2上一切正常,但我想知道如果两个线程都在查看相同的变量并且每个核心上的此变量的本地缓存值不同步,我是否会遇到任何问题.
我知道volatile关键字会强制变量从内存中刷新,但多核x86处理器是否有办法强制所有内核的缓存同步?这是我需要担心的事情,还是易失性和正确使用轻量级锁定机制(我使用_InterlockedExchange设置我的易失性管道变量)处理我想为多核x86 CPU编写"无锁"代码的所有情况?
我已经知道并使用了Critical Sections,Mutexes,Events等等.我主要想知道是否有x86内在函数,我不知道哪种力量或可用于强制缓存一致性.
是否有一些替代品map并行评估列表?我不需要它懒惰.
类似的东西:pmap :: (a -> b) -> [a] -> [b]让我pmap expensive_function big_list拥有100%的核心.
我维护一个自定义的类似CMS的应用程序.
每当提交文档时,都会执行几项任务,这些任务可以大致分为以下几类:
类别1包括与文档内容相关的各种MySQL表的更新.
类别2包括解析存储在MySQL LONGTEXT字段中的HTML内容以执行一些自动锚标记转换.我怀疑在这项任务中花费了大量的计算时间.
类别3包括仅使用与文档对应的少数字段对基于MySQL的简单搜索索引的更新.
所有这些任务都需要完成才能使文档提交完整.
承载此应用程序的计算机具有双四核Xeon处理器(总共8个核心).但是,每当文档提交时,执行的所有PHP代码都被限制为在其中一个核上运行的单个进程.
我的问题:
您有多少方案(如果有的话)将PHP/MySQL Web应用程序处理负载分散到多个CPU内核中?我理想的解决方案基本上会产生一些进程,让它们在几个内核上并行执行,然后阻塞直到所有进程完成.
相关问题:
您最喜欢的PHP性能分析工具是什么?
如今,Erlang作为一种在多核上编写并行程序的语言,现在引起了很多人的兴趣.我听说有人认为Erlang的消息传递模型比主流共享内存模型(如线程)更容易编程.
相反,在高性能计算社区中,主要的并行编程模型是MPI,它也实现了消息传递模型.但是在HPC领域,这种消息传递模型通常被认为很难编程,人们认为OpenMP或UPC等共享内存模型更容易编程.
有谁知道为什么在IT和HPC世界中对消息传递与共享内存的看法存在这样的差异?是否由于Erlang和MPI如何实现消息传递的一些根本区别,使得Erlang风格的消息传递比MPI更容易?还是有其他原因吗?
我正在从一个线程发送网络数据包,并在另一个运行在不同CPU核心上的线程上接收回复.我的进程测量每个数据包的发送和接收之间的时间(类似于ping).我正在使用rdtsc来获得高分辨率,低开销的时序,这是我的实现所需要的.
所有测量看起来都很可靠.尽管如此,我仍然担心核心的rdtsc准确性,因为我一直在阅读一些暗示tsc未在核心之间同步的文本.
恒定的TSC行为可确保每个时钟周期的持续时间均匀,并支持将TSC用作挂钟定时器,即使处理器内核更改频率也是如此.这是所有英特尔处理器的架构行为.
我仍然担心核心的累积性,这是我的问题
我使用java 8流和并行流编写代码以获得与自定义收集器相同的功能来执行聚合功能.当我看到CPU使用率时htop,它显示了用于"流"和"并行流"版本的所有CPU核心.因此,似乎在使用list.stream()时,它也使用所有CPU.这里,就多核的使用而言,parallelStream()和stream()之间的确切区别是什么.
我正在开发一个处理许多请求的程序,它们都没有超过50%的CPU(目前我正在研究双核).所以我为每个请求创建了一个线程,整个过程更快.处理9个请求,单个线程持续02min08s,同时3个线程同时工作,时间减少到01min37s,但它不使用100%CPU,只有大约50%.
我怎么能让我的程序使用完整的处理器功能?
编辑 应用程序不是IO或内存有限,它们始终处于合理的水平.
我认为它与'双核'事物有关.
有一个锁定的方法调用,每个请求使用,但它真的很快,我不认为这是问题.
我的代码中代价更高的部分是通过COM调用dll(从所有线程调用相同的外部方法).这个dll也没有内存或IO限制,它是一个AI识别组件,我正在进行OCR识别薪水,支票请求.
EDIT2
STA COM方法很可能是我的问题,我联系了组件所有者以解决这个问题.
我在Ubuntu工作站上运行R,它有8个虚拟内核和8 Gb内存.我希望经常使用多核软件包来并行使用8个核心; 但是我发现整个R过程重复了8次.由于R实际上似乎使用了比gc中报告的更多的内存(即使在gc()之后也是如此),这意味着即使相对温和的内存使用(一个200Mb对象)在重复8次时变得难以处理内存.我调查了bigmemory让子进程共享相同的内存空间; 但它需要对我的代码进行一些重大改写,因为它不处理数据帧.
有没有办法在分叉之前使R尽可能精简,即让OS尽可能多地回收内存?
编辑:我想我明白现在发生了什么.问题不在我想象的地方 - 父线程中存在且未被操纵的对象不会重复八次.相反,我的问题来自于我正在使每个子进程执行的操作的性质.每个人都必须操纵一个具有数十万级别的重要因素,我认为这是一个记忆很重的一点.结果,确实存在总存储器负载与核心数成比例的情况; 但没有我想象的那么戏剧化.我学到的另一个教训是,有4个物理内核+超线程的可能性,超线程实际上对于R来说通常不是一个好主意.增益很小,内存成本可能非常重要.所以我从现在开始研究4核.
对于那些想要试验的人来说,这是我运行的代码类型:
# Create data
sampdata <- data.frame(id = 1:1000000)
for (letter in letters) {
sampdata[, letter] <- rnorm(1000000)
}
sampdata$groupid = ceiling(sampdata$id/2)
# Enable multicore
library(multicore)
options(cores=4) # number of cores to distribute the job to
# Actual job
system.time(do.call("cbind",
mclapply(subset(sampdata, select = c(a:z)), function(x) tapply(x, sampdata$groupid, sum))
))
Run Code Online (Sandbox Code Playgroud) 由于我对这个问题的回答,我开始阅读关键字volatile以及关于它的共识.我看到有很多关于它的信息,一些旧的现在看起来是错的,而且很多新的说它在多线程编程中几乎没有位置.因此,我想澄清具体的用法(在SO上找不到确切的答案).
我还想指出我一般都理解编写多线程代码的要求,以及为什么volatile不解决问题.不过,我看到代码volatile用于我工作的代码库中的代码.此外,这是我使用volatile关键字的唯一情况,因为所有其他共享资源都已正确同步.
假设我们有一个类:
class SomeWorker
{
public:
SomeWorker() : isRunning_(false) {}
void start() { isRunning_ = true; /* spawns thread and calls run */ }
void stop() { isRunning_ = false; }
private:
void run()
{
while (isRunning_)
{
// do something
}
}
volatile bool isRunning_;
};
Run Code Online (Sandbox Code Playgroud)
为简单起见,有些事情被遗漏了,但重要的是创建了一个对象,它在新生成的线程中执行某些操作,检查a(volatile)布尔值以了解它是否应该停止.只要希望工作者停止,就会从另一个线程设置此布尔值.
我的理解是,volatile在这种特定情况下使用的原因只是为了避免任何将其缓存在循环寄存器中的优化.因此,导致无限循环.没有必要正确地同步事物,因为工作线程最终将获得新值?
我想知道这是否被认为是完全错误的,如果正确的方法是使用同步变量?编译器/架构/核心之间有区别吗?也许这只是一个值得避免的草率方法?
如果有人澄清这一点,我会很高兴.谢谢!
编辑
我有兴趣看到(在代码中)你如何选择解决这个问题.