使用时有没有办法保证订单Parallel.ForEach()?我正在循环的集合需要保持它的顺序,但我正在寻找一些性能改进.
parallel-processing asp.net-4.0 task-parallel-library parallel-for
我刚刚在新的OpenCV 2.4.3中看到他们添加了一个通用的parallel_for.所以按照这个例子,我试着自己实现它.我用我的代码完成了所有功能,但是当我按照常规"for"命令以典型的串行方式对其处理时间进行计时时,结果显着更快,或者通常稍慢一点!
我想也许这与我推入向量或其他东西有关(我对并行处理我是一个非常大的菜鸟),所以我设置了一个只运行一个大数字的测试循环,它仍然无法正常工作.
码:
class Parallel_Test : public cv::ParallelLoopBody
{
private:
double* const mypointer;
public:
Parallel_Test(double* pointer)
: mypointer(pointer){
}
void operator() (const Range& range) const
{
//This constructor needs to be here otherwise it is considered an abstract class.
// qDebug()<<"This should never be called";
}
void operator ()(const cv::BlockedRange& range) const
{
for (int x = range.begin(); x < range.end(); ++x){
mypointer[x]=x;
}
}
};
//TODO Loop pixels in parallel
double t = (double)getTickCount();
//TEST PARALELL …Run Code Online (Sandbox Code Playgroud) 我有以下程序:
int main(){
double sum=0;
#pragma omp parallel for reduction(+:sum)
for(double x=0;x<10;x+=0.1)
sum+=x*x;
}
Run Code Online (Sandbox Code Playgroud)
当我编译它时,我得到错误invalid type for iteration variable ‘x’.
我认为这意味着我只能将parallel for构造应用于基于整数的循环.但是我的循环的内部确实依赖于它是浮点数.
有没有办法说服OpenMP这样做?有推荐的替代方法吗?
我正在尝试并行编程.我有一个正常的循环:
for (int i = 0; i < 100000; i++)
{
Console.WriteLine("Thread ID: {0} and i is " + i + " Time Elapsed: " + sw.Elapsed,
Thread.CurrentThread.ManagedThreadId);
}
Run Code Online (Sandbox Code Playgroud)
这个循环只是将数字增加到100000
我可以使用此for循环并将其转换为Parallel.For循环以将数字计数到100000但是并行使用所有CPU吗?
此外,使用a时Parallel.For,需要哪些参数?你会如何以一种非常基本的方式使用它?
我想知道在执行parfor时是否可以在节点之间交换(发送和接收)数据.我想要完成的是这样的事情:
parfor i = 1:4
%Perform a computation on each column of a 4x4 matrix on 4 different workers (each worker takes one column).
%Make Worker #1 send its data to Worker #3, Worker #3 to Worker #1, Worker #2 ro Worker #4 and Worker #4 to Worker #2.
%Make other computations on the data received from the other workers
end
Run Code Online (Sandbox Code Playgroud)
我想在不离开parfor的情况下执行所有这些计算.我可以使用任何MPI命令吗?这可以实现吗?如果是这样,我怎么能实现这个目标?谢谢!
我有代码,我必须并行地运行parallel_for(彼此独立).
代码是这样的:
tbb::parallel_for(range1,func1());//first
tbb::parallel_for(range2,func2());//second
tbb::parallel_for(range3,func3());//third
Run Code Online (Sandbox Code Playgroud)
我尝试过使用task_group.还有其他方法吗?
无论如何都要增加一个Parallel.For一旦启动就会做的循环次数?示例如下:
var start = 0;
var end = 5;
Parallel.For(start, end, i =>
{
Console.WriteLine(i);
end = 10;
});
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
松鸦
我正在使用本地函数定义来运行代码块N次,就像C#的并行版本一样,但是f当我在同一范围内使用两个或更多个函数时,它会给函数带来多个定义错误.如何在相同范围内每次使用后逐步更改功能名称,如f1,f2,f3,..
定义:
#ifndef PARALLEL_FOR
#define PARALLEL_FOR(N,O) \
struct LocalClass \
{ \
void operator()(int i) const O \
} f; \
std::thread threads[N]; \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI]=std::thread(f,loopCounterI); \
} \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI].join(); \
} \
#endif
Run Code Online (Sandbox Code Playgroud)
用法:
PARALLEL_FOR(
5,
{std::cout<<100*i<<std::endl;}
);
Run Code Online (Sandbox Code Playgroud)
输出:
0
300
200
100
400
Run Code Online (Sandbox Code Playgroud)
通常加入{\和}\将解决随之而来的电话,但如果我这样做了嵌套并行?