我发现了一些非常相似的问题,这些问题帮助我找到了一个似乎有用的脚本但是我仍然不确定我是否完全理解为什么,因此这个问题......
我的问题(例子):在3个节点上,我想在每个节点上运行12个任务(总共36个任务).此外,每个任务都使用OpenMP,并且应该使用2个CPU.在我的例子中,一个节点有24个CPU和64GB内存.我的脚本是:
#SBATCH --nodes=3
#SBATCH --ntasks=36
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=2000
export OMP_NUM_THREADS=2
for i in {1..36}; do
srun -N 1 -n 1 ./program input${i} >& out${i} &
done
wait
Run Code Online (Sandbox Code Playgroud)
这似乎按照我的要求工作,在节点上连续运行任务,直到该节点上的所有CPU都在使用,然后继续在下一个节点上运行更多任务,直到再次使用所有CPU等.
我的问题..我不确定这是否真的是它(?),因为我没有完全理解关于-n的srun的手册页,我之前没有使用srun.主要是我的混淆来自"-n":在-n的手册页中说"默认是每个节点一个任务,",所以我预计如果我使用"srun -n 1"只有一个任务将是在每个节点上运行,但似乎并非如此.此外,当我尝试例如"srun -n 2 ./program"时,似乎只运行完全相同的程序两次作为两个不同的任务,无法使用不同的输入文件..我无法想到为什么会这样有用?
首先,我2个月前才开始编程C/C++(但是有更多的Java经验),所以我对C/C++的经验很少.我正在撰写一篇论文,并正在使用/扩展为此目的而为之前的研究编写的其他代码.
现在,这个错误肯定是我遇到的最奇怪的事情,花了我差不多3个小时才找到并缩小到最基本的形式我可以用它来重现它.最后,我有以下代码的这两个文件
c.hh:
#ifndef C_HH_
#define C_HH_
class complex {
public:
double re;
};
#endif
Run Code Online (Sandbox Code Playgroud)
test.cc:
#include <iostream>
#include "c.hh"
int main(int argc, char **argv) {
complex* c;
c->re = 0.0;
for (int i = 0; i < 3; ++i) {
c->re = (c->re) + (i==1)?0:1;
}
std::cout << c->re;
}
Run Code Online (Sandbox Code Playgroud)
我可以拿出的唯一一行仍然会出现错误,即c.re的初始化,即"c-> re = 0.0;".但是,我留下了这个,因为即使我删除代码的下半部分,如果没有这行,错误仍然会发生,因为c.re尚未初始化(或者我认为?).
我发现其他一切都是重现错误的必要条件,即
1)for循环.如果i = 1,2,3的行是单独写的,则不会导致错误.
2)我的极限!例如,如果我只从0到2运行,则不会导致错误.仅在至少3次迭代后才会发生.
3)显式赋值"c-> re =(c-> re)+",使用"+ ="而不是"=(c-> re)+"不会导致错误.
4)i"(i == 1)?0:1"的评估和(!)条件检查.使用if(..)执行此操作也会导致错误,但如果不使用i,则不会导致错误,或者不执行条件检查.
5)c.re的输出.即"std :: cout << c-> re;".简单地评估c.re("c-> re;")不会导致错误.如果只有输出而没有评估c.re,它也不会导致错误.通过"fprintf(stdout,"%d",c - > - re)执行相同操作;" …
我已经使用了相当数量的 C++,但没有那么多std::list.. 在我当前的项目中,我需要一个std::list<..>数据成员,以及跟踪列表中带有std::list<..>::iterator. 该对象也必须是可移动的,但在我的情况下,默认的移动构造函数是不可能的。这里std::list做了一些让我感到惊讶的事情。
考虑
#include <list>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
template<typename T>
void test() {
T l { 1, 2, 3, 4, 5 };
cout << "l = "; for(const auto& e: l) cout << e << " "; cout << endl;
auto pos = find(l.begin(), l.end(), 6);
if (pos == l.end()) cout << "l end\n";
cout << "---- moving l > lmv ----" << endl; …Run Code Online (Sandbox Code Playgroud)