我目前的任务是优化蒙特卡罗模拟,该模拟根据一组Obligors计算资本充足率数据.
它运行大约10倍太慢,无法生产,需要数量或每日运行.此外,结果数字的粒度需要在某个阶段提升到桌面可能的书本水平,我给出的代码基本上是一个原型,由半生产能力的业务部门使用.
该应用程序目前是单线程的,所以我需要使它多线程,可能看看System.Threading.ThreadPool或Microsoft Parallel Extensions库但我在这家银行的服务器上受限于.NET 2所以我可能不得不考虑这个人的端口,http://www.codeproject.com/KB/cs/aforge_parallel.aspx.
我正在尽力让他们升级到.NET 3.5 SP1,但这是在这种规模的组织中的一项重要练习,在合同时间框架内可能无法实现.
我使用dotTrace的试用版(http://www.jetbrains.com/profiler)描述了该应用程序.还有哪些好的剖析器?免费的?
大量的执行时间用于生成均匀的随机数,然后将其转换为正态分布的随机数.他们正在使用C#Mersenne twister实现.我不确定他们在哪里获得它,或者它是最好的方法来实现这个(或最佳实现)来生成统一的随机数.然后将其转换为正态分布版本以供计算使用(我还没有深入研究过翻译代码).
使用以下内容的经验是什么?
http://www.qlnet.org(Quantlib的C#端口)或
您知道的任何替代方案?我是C#开发人员,所以更喜欢C#,但C++的包装应该不是问题,是吗?
也许更快地利用C++实现.我认为这些库中的一些库将具有最快的方法来直接生成正态分布的随机数,而无需转换步骤.此外,他们可能还有一些其他功能,将有助于后续计算.
此外,它所使用的计算机是四核Opteron 275,8 GB内存,但Windows Server 2003 Enterprise 32位.我应该建议他们升级到64位操作系统吗?任何支持这一决定的文章的链接都将非常感激.
无论如何,任何建议和帮助你都非常感激.
我对Perl中的这个Parallel :: ForkManager模块很新,它有很多学分,所以我认为它支持我需要的东西,我还没想到.
我需要做的是在每个子进程中,它根据每个子进程中计算的键值将一些更新写入全局哈希映射.但是,当我继续在for循环之外声明一个哈希映射并期望在循环之后更新哈希映射时,事实证明哈希映射保持为空.这意味着虽然循环内部的更新成功(通过打印出值),但在循环外部则不然.
有没有人知道如何编写这样一段代码来完成我想要的工作?
C#struct是否是线程安全的?
例如,如果有:
struct Data
{
int _number;
public int Number { get { return _number; } set { _number = value; } }
public Data(int number) { _number = number; }
}
Run Code Online (Sandbox Code Playgroud)
在另一种类型:
class DadData
{
public Data TheData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
是属性名为TheData,线程安全吗?
我有一个应用程序,它使用多线程同时执行30个独立任务,每个任务通过http检索数据,执行计算并将结果返回给ui线程.
我可以使用TPL执行相同的任务吗?
TPL是否创建了30个新线程并将它们分布在所有可用内核上,还是仅将任务分配到可用内核上并且每个内核使用一个线程?
在这种情况下,使用TPL而不是多线程是否会提升性能?
I wrote a multi-threaded app to benchmark the speed of running LOCK CMPXCHG (x86 ASM).
On my machine (dual Core - Core 2), with 2 threads running and accessing the same variable, I can perform about 40M ops/second.
Then I gave each thread a unique variable to operate on. Obviously this means there's no locking contention between the threads, so I expected a speed performance. However, the speed didn't change. Why?
为了在Ruby或Python中获得真正的并发性,我需要创建新的进程.Python使用该multiprocessing模块非常简单,它抽象出所有的fork/wait优点,让我专注于我的代码.Ruby有类似的东西吗?现在我正在调用Process.fork并Process.wait获得我的并发性,我想要一个更清洁的解决方案.
我正在尝试使用Julia并行实现代码.我正在使用@everywhere宏来使所有进程从RemoteRef获取数据.
是否可以使用仅在@everywhere表达式中的第一个进程上定义的变量名称,并以某种方式指定我希望它将该变量的值而不是变量名称发送到所有进程?
例:
r = RemoteRef()
put(r, data)
@everywhere data = fetch(r)
Run Code Online (Sandbox Code Playgroud)
这会返回错误,因为r未在所有进程上定义.
我应该如何将数据移动到所有进程?
另外,我可以告诉Julia在表达式中放置值而不是变量名吗?类似于如何name = "John"; println("Hello, $name")打印的东西"Hello, John"
如何从zsh导出函数,以便我可以在gnu parallel中使用它?
例:
function my_func(){ echo $1;}
export -f my_func
parallel "my_func {}" ::: 1 2
Run Code Online (Sandbox Code Playgroud)
在bash中输出
1
2
Run Code Online (Sandbox Code Playgroud)
而在zsh中它将输出错误消息
/bin/bash: my_func: command not found
/bin/bash: my_func: command not found
Run Code Online (Sandbox Code Playgroud) 我有一个方法:
IList<string> pages = new List<string>();
foreach (var node in nodes)
{
try
{
string temp = DoSomeComplicatedModificationOnNode(node);
if (temp.ToLower().Contains(path))
{
pages.Add(node.Title);
}
}
catch (Exception)
{
continue;
}
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,DoSomeComplicatedModificationOnNode()会给出异常,这就是使用try {} catch块的原因 - 我可以跳过给出异常的项目.节点数包含数千个项目,项目具有多个属性.如何优化此循环?我在考虑Parallel.Foreach,但是下面的代码给出了一个错误"Missing current principal":
IList<string> pages = new List<string>();
Parallel.ForEach(pageNodes, node =>
{
try
{
string temp = DoSomeComplicatedModificationOnNode(node);
if (temp.ToLower().Contains(path))
{
pages.Add(node.Title);
}
}
catch (Exception)
{
}
});
Run Code Online (Sandbox Code Playgroud) sbatch手册页中使用的术语可能有点令人困惑.因此,我想确保我正确设置选项.假设我有一个任务在一个有N个线程的节点上运行.我是否正确地假设我会使用--nodes = 1和--ntasks = N?我习惯于考虑使用例如pthreads在单个进程中创建N个线程.他们称之为"核心"或"每个任务的cpus"的结果是什么?CPU和线程在我的脑海里并不是一回事.