我有以下代码:
myfun <- function() {
fun2()
return(1+1)
}
Run Code Online (Sandbox Code Playgroud)
我希望fun2()被调用,然后移到下一行而不等待结果。fun2函数不返回任何内容,我也不关心它何时完成,我只需要启动它即可。最好的方法是什么?并行进程,多线程,异步调用?任何代码示例,不胜感激。
我想学习并行编程以加速算法并选择Java.
我写了两个函数来对long数组中的整数求和- 一个简单的迭代遍历数组,第二个 - 将数组分成几个部分,并在分离的线程中汇总部分.
我预计使用两个线程的速度大约是2倍.但是,我得到的只是加速了24%.而且,使用更多线程,我在两个线程上没有任何改进(可能少于1%).我知道应该有线程创建/加入开销,但我想它不应该那么大.
你能解释一下,我错过了什么或代码中的错误在哪里?这是代码:
import java.util.concurrent.ThreadLocalRandom;
public class ParallelTest {
public static long sum1 (long[] num, int a, int b) {
long r = 0;
while (a < b) {
r += num[a];
++a;
}
return r;
}
public static class SumThread extends Thread {
private long num[];
private long r;
private int a, b;
public SumThread (long[] num, int a, int b) {
super();
this.num = num;
this.a = a;
this.b = b;
} …Run Code Online (Sandbox Code Playgroud) 在我的Fortran 95代码中,我有一系列嵌套的DO循环,整个过程需要大量的时间来计算,所以我想用OpenMP添加并行功能(gfortran -fopenmp用于编译/构建).
有一个主要的DO循环,运行1000次.
其中有一个子DO循环,运行100次.
其他几个DO循环嵌套在此中,迭代次数随着DO循环的每次迭代而增加(第一次一次,最后一次最多1000次).
例:
DO a = 1, 1000
DO b = 1, 100
DO c = 1, d
some calculations
END DO
DO c = 1, d
some calculations
END DO
DO c = 1, d
some calculations
END DO
END DO
d = d + 1
END DO
Run Code Online (Sandbox Code Playgroud)
一些嵌套的DO循环必须以串行方式运行,因为它们本身包含依赖关系(也就是说,循环的每次迭代都有一个包含上一次迭代的值的计算),并且在这种情况下不能轻易并行化.
我可以轻松地使没有任何依赖项的循环并行运行,如下所示:
d = 1
DO a = 1, 1000
DO b = 1, 100
DO c = 1, d
some calculations with dependencies
END …Run Code Online (Sandbox Code Playgroud) 有什么方法可以通过TPL节流来限制性能下降吗?
我有一个复杂的组件管道,并试图限制所需的内存需求。我从多个文件中并行读取,管道中的组件可能会从这些文件的随机部分中读取一些内容,其余组件则进行CPU绑定操作。
我使用通用测试方法将性能测试平台简化为这些测试。
private void TPLPerformaceTest(int generateNumbers, ExecutionDataflowBlockOptions transformBlockOptions)
{
var transformBlock = new TransformBlock<int, int>(i => i, transformBlockOptions);
var storedCount = 0;
var generatedCount = 0;
var store = new ActionBlock<int>(i => Interlocked.Increment(ref storedCount));
transformBlock.LinkTo(store);
transformBlock.Completion.ContinueWith(_ => store.Complete());
for (int i = 0; i < generateNumbers; i++)
{
transformBlock.SendAsync(i).Wait(); //To ensure delivery
Interlocked.Increment(ref generatedCount);
}
transformBlock.Complete();
store.Completion.Wait();
Assert.IsTrue(generatedCount == generateNumbers);
Assert.IsTrue(storedCount == generateNumbers);
}
Run Code Online (Sandbox Code Playgroud)
第一个没有节流。在我的CPU上,大约需要12秒钟才能完成,消耗约800MB的RAM,平均CPU利用率约为35%。
[Test]
public void TPLPerformaceUnlimitedTest()
{
var …Run Code Online (Sandbox Code Playgroud) c# parallel-processing performance performance-testing tpl-dataflow
给定一个由几个节点组成的集群,每个节点都托管多核处理器,在使用纯全MPI的节点和节点内的OpenMP/pthread 之间使用MPI有什么好处?如果我理解正确,如果我在一个节点上运行MPI程序并指示进程数等于内核数,那么我将在一个单独的内核上运行多个进程的一个诚实的并行MPI作业.那么为什么要使用节点内的线程和节点之间的MPI来进行混合并行化呢?在MPI + CUDA混合的情况下我毫无疑问,因为MPI不能使用GPU,但它可以使用CPU内核,那么为什么要使用线程呢?
假设我有一个Stream<Callable<SomeClass>> stream;.该流正在访问超过一百万个不适合内存的对象.
将此转换为a的惯用方法是什么Stream<SomeClass>,以确保在Callable::call传递给非线程安全的消费者(可能通过调用.sequential().forEach()或其他一些瓶颈机制)之前并行执行?
即并行处理流,但顺序传递输出(随机顺序ok,只要它是单线程).
我知道我可以通过在原始流和消费者之间建立一个ExecutionService和一个来做我想做的事Queue.但这似乎是很多代码,是否有一个神奇的单行程?
我的数据框"A"看起来像这样:
type latw lngs late lngn
0 1000 45.457966 9.174864 45.458030 9.174907
1 1000 45.457966 9.174864 45.458030 9.174907
2 1000 45.458030 9.174864 45.458094 9.174907
3 1000 45.458094 9.174864 45.458157 9.174907
4 1000 45.458157 9.174864 45.458221 9.174907
5 1000 45.458221 9.174864 45.458285 9.174907
6 1000 45.458285 9.174864 45.458349 9.174907
7 1000 45.458349 9.174864 45.458413 9.174907
8 1000 45.458413 9.174864 45.458477 9.174907
9 1000 45.458477 9.174864 45.458540 9.174907
10 1000 45.458540 9.174864 45.458604 9.174907
11 1000 45.458604 9.174864 45.458668 9.174907
12 1000 …Run Code Online (Sandbox Code Playgroud) 我想std::vector<int>用openmp 填充零。如何快速做到这一点?
我听说循环遍历向量将每个元素设置为零很慢,而且std::fill快得多。现在还是这样吗?
将std :: vector <int>的每个值重置为0的最快方法
我是否必须手动将std::vector<int>区域划分为多个区域,#pragma omp for在每个线程上使用循环,然后std::fill在循环中使用?
我开发了一个包含令人难以置信的并行功能的R包.
我希望以对用户透明的方式实现这些功能的并行化,而不管他/她的OS(至少理想情况下).
我环顾四周看看其他软件包作者是如何导入基于foreach的Parallelism的.例如,Max Kuhn的caret包导入foreach要使用,%dopar%但依赖 于用户指定并行后端.(使用了几个示例doMC,这在Windows上不起作用.)
注意doParallel适用于Windows和Linux/OSX并使用内置parallel包(请参阅此处的注释以进行有用的讨论),导入doParallel并registerDoParallel()在用户指定parallel=TRUE为参数时调用函数是否有意义?
我运行了以下matlab代码:
rng(1)
matrix_size = 200;
iterations = 100000;
A = rand(matrix_size);
B = rand(matrix_size);
profile on
for i = 1:iterations
A * B;
end
profile off
Run Code Online (Sandbox Code Playgroud)
在我的MacAir(Intel(R)Core(TM)i5-4260U CPU @ 1.40GHz)上,这需要39秒.在具有7核(Intel(R)Xeon(R)CPU E5-2687W v4 @ 3.00GHz)的工作站上,这需要62秒.
我没有说明-singleCompThread.工作站有12个核心,但有5个单线程进程在运行.我(差不多)有7个核心给自己.他们一直都是最大限度的.
怎么会这样?
运行上面的代码时-singleCompThread,它在54s内完成.