我有这个旧的批处理系统.调度程序将所有计算节点存储在一个大数组中.现在大多数情况下都可以,因为大多数查询都可以通过筛选满足查询的节点来解决.
我现在遇到的问题是,除了一些基本属性(cpus,内存,操作系统的数量)之外,还有这些奇怪的分组属性(城市,infiniband,网络划痕).
现在,这些问题是,当用户请求节点与InfiniBand的我不能只是给他的任何节点,但我得给他节点连接到一个InfiniBand交换机,所以节点可以使用InfiniBand实际通信.
这仍然没问题,当用户只请求一个这样的属性时(我可以为每个属性分区数组,然后尝试分别选择每个分区中的节点).
问题在于组合多个这样的属性,因为那时我将不得不生成子集的所有组合(主阵列的分区).
好处是大多数属性都处于子集或等价关系中(对于一个infiniband交换机上的计算机来说,它在一个城市中是有意义的).但遗憾的是,这并非严格属实.
是否有一些良好的数据结构用于存储这种半分层的大多数树状的东西?
编辑:例子
node1 : city=city1, infiniband=switch03, networkfs=server01
node2 : city=city1, infiniband=switch03, networkfs=server01
node3 : city=city1, infiniband=switch03
node4 : city=city1, infiniband=switch03
node5 : city=city2, infiniband=switch03, networkfs=server02
node6 : city=city2, infiniband=switch03, networkfs=server02
node7 : city=city2, infiniband=switch04, networkfs=server02
node8 : city=city2, infiniband=switch04, networkfs=server02
Run Code Online (Sandbox Code Playgroud)
用户要求:
2x node with infiniband and networkfs
Run Code Online (Sandbox Code Playgroud)
期望的输出是:(node1, node2)或(node5,node6)或(node7,node8).
在一个好的情况下,这个例子不会发生,但在某些情况下我们实际上有这些奇怪的跨站点连接.如果city2inin中的节点都在infiniband上switch04,那将很容易.不幸的是,现在我必须生成具有相同infiniband交换机和相同网络文件系统的节点组.
实际上,问题要复杂得多,因为用户不会请求整个节点,并且属性很多.
编辑:为查询添加了所需的输出.
我正在测试算法并遇到这种奇怪的行为,当时std::accumulate比简单for循环更快.
看看生成的汇编程序我不是更明智:-)似乎for循环被优化为MMX指令,而累积则扩展为循环.
这是代码.行为表现为-O3优化级别,gcc 4.7.1
#include <vector>
#include <chrono>
#include <iostream>
#include <random>
#include <algorithm>
using namespace std;
int main()
{
const size_t vsize = 100*1000*1000;
vector<int> x;
x.reserve(vsize);
mt19937 rng;
rng.seed(chrono::system_clock::to_time_t(chrono::system_clock::now()));
uniform_int_distribution<uint32_t> dist(0,10);
for (size_t i = 0; i < vsize; i++)
{
x.push_back(dist(rng));
}
long long tmp = 0;
for (size_t i = 0; i < vsize; i++)
{
tmp += x[i];
}
cout << "dry run " << tmp << …Run Code Online (Sandbox Code Playgroud) 我有一个git存储库完全跟踪远程SVN仓库.现在我需要添加一个新的分支,它将跟踪一个完全不同的SVN仓库中的目录.
那可能吗?
我有一个公开的回购.
问题是我已经使用了很长时间,这意味着裸机库中有很多垃圾.有大量死枝,删除标签等...
是否有一些命令来清理裸仓库?有些像git remote prune这样适用于相反的情况吗?
编辑:因为似乎有些混乱.这是我的设置:
DevelMachine1
^
|
v
MainDevelRepo <-> MainRepo -> PublicBareRepo (with a lot of junk) -> The World
^
|
v
DevelMachine2
Run Code Online (Sandbox Code Playgroud) 我到达了需要比较singed和unsigned值的点.到目前为止,我总是修改代码库以完全避免这种情况,但现在我不能这样做.
那么处理烧结和无符号比较的真正正确方法是什么?这是一个混合的C/C++代码库,所以我的问题适用于这两种语言.
我正在检查资源(已签名)与请求的值(未签名).
if (requested > resource.max) return Never;
if (requested > resource.free - resource.assigned) return NotNow;
return Now;
Run Code Online (Sandbox Code Playgroud)
我正在考虑这样的事情(在适用的情况下替换C++变体):
if (requested > (unsigned)INT_MAX) bail_out(); // assert,abort,throw,return....
if ((signed)requested > resource.max) return Never;
if ((signed)requested > resource.free - resource.assigned) return NotNow;
return Now;
Run Code Online (Sandbox Code Playgroud)
我正确地接近这个,还是有更好的方法?
在这里我需要C++数组类模板,它是固定大小的,基于堆栈的,并且不需要默认构造函数的答案我发布了一段代码,即使用了新的char数组.对我来说,这是绝对正常的.但根据评论,这段代码是错误的.
谁能更详细地解释一下?
具体来说阵列可能出错.我从评论中理解的是,T x[size];可能不适合char x[size*sizeof(T)];.我不相信这是真的.
编辑:
我越来越困惑了.我知道结构的对齐方式.是的,当你有一个结构时,属性从不同的偏移开始,那么你可能会想.
好的,现在我们回到阵列了.你告诉我,T x[size];它的大小与char x[size*sizeof(T)];我相同,但我不能将char数组作为T数组访问,因为可能存在一些对齐.当阵列具有相同的大小时,如何对齐?
编辑2:
好吧,我终于明白了,它可能从一个错误的地址开始.
编辑3:
大家好,你可以停止发帖:-) P,这总让我大吃一惊.我从未意识到这是可能的.
gcc和g ++之间的链接过程有什么不同吗?
我有一个很大的C项目,我只是将部分代码切换到C++.代码尚未使用std C++库,因此-llibstdc++现在不需要.
实际上std::string可以容纳'\0'角色的事实总是会出现.这当然与C风格的字符串不一致.
所以我想知道,这是设计,还是遗漏,还是只是标准不禁止它,编译器允许这种情况发生?
Qt有自己的boost :: optional替代方案,还是应该只使用boost :: optional?