在 C++/CLI 中并行执行程序
Posted
技术标签:
【中文标题】在 C++/CLI 中并行执行程序【英文标题】:Parallel execution of program within C++/CLI 【发布时间】:2016-03-18 01:35:45 【问题描述】:我正在编写一个 Windows 窗体程序 (C++/CLI),它在一个大的“for”循环中多次调用可执行程序。我想并行调用可执行文件,因为运行一次最多需要一分钟。
windows窗体代码的关键部分是大的for循环(实际上是2个循环):
for (int a=0; a<1000; a++)
for (int b=0; b<100; b++)
int run = a*100 + b;
char startstr[50], configstr[50]; strcpy(startstr, "solver.exe");
sprintf(configstr, " %d %d %d", run, a, b);
strcat(startstr, configstr);
CreateProcessA(NULL, startstr,......) ;
solver.exe 程序使用整数“run”、“a”和“b”。 “运行”用于从每个程序运行中写入一个唯一的输出文本文件。 “a”和“b”是用于读取特定输入文本文件的数字。这些并不是每次运行所独有的。
我不在每次调用“CreateProcess”后等待,因为我希望这些并行执行。
目前我的代码正在运行并且似乎可以正常工作。但是,它会同时处理大量solver.exe 程序实例,导致我的计算机变得非常缓慢,直到一切都完成。
我的问题是,如何创建一个队列来限制并发进程的数量(例如机器上的物理内核数量),以便它们不会都尝试同时运行?当 for 循环设置得更大时,内存也可能是一个问题。
第二个问题是,solver.exe 的不同实例潜在的并发文件读取是否会产生问题? (我可以解决这个问题,但如果我不需要,我不想这样做。)
我熟悉 openmp 和 C,但这是我第一次尝试在 Windows 窗体程序中运行并行进程。
谢谢
【问题讨论】:
这必须是单独的 .exe 吗?如果您控制求解器代码,如果它是一个 DLL,它会更容易。 "solver.exe 的不同实例读取潜在的并发文件会产生问题吗?"这取决于 - 如果它只是在读取,那么只要确保不以任何方式锁定文件就可以了。 无论如何,这可能是重复的。看看这个,看看它是否符合您的需求:***.com/questions/42531/… 题外话:使用std::stringstream
可以省去很多麻烦。 std::stringstream startstr; startstr <<"solver.exe "<< run << ' ' << a << ' ' << b; CreateProcessA(NULL, startstr.str().c_str(),......) ;
是的,文件只是读取而不是写入。
【参考方案1】:
我已经成功地使用 OpenMP 函数“parallel for”来并行运行外部循环,并使用函数 omp_set_num_threads() 来设置并发进程的数量。正如建议的那样,并发文件读取没有对我的系统造成任何问题。
【讨论】:
以上是关于在 C++/CLI 中并行执行程序的主要内容,如果未能解决你的问题,请参考以下文章