我喜欢InfiniBand承诺的40Gbit/s网络.我的需求没有映射到具有一个核心节点+从属的MPI模型,如果可能,我宁愿不使用MPI.我需要简单的连接/发送/接收/关闭(或其异步版本)API.然而,在MS Azure文档和 Microsoft HPC Pack文档中,我无法找到任何可以使用InfiniBand作为我的应用程序传输的C/C++或.Net API.所以我的问题很简单,如何使用InfiniBand连接到其他节点并向其发送数据包并在另一端接收?(类似于一些Socket API或类似的东西)
Azure上的ND-SPI或Azure上的DAPL-ND 连接/发送/接收/关闭教程是我正在寻找的.
是值得学习惯例还是可读性和可维护性的祸害?
它看起来像下面的程序计算一个无效的指针,因为NULL除了赋值和比较相等之外没有任何好处:
#include <stdlib.h>
#include <stdio.h>
int main() {
char *c = NULL;
c--;
printf("c: %p\n", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,似乎GCC或Clang针对未定义行为的警告或工具都没有说这实际上是UB.这个算术实际上是否有效,而且我太迂腐了,或者这是我们应该报告的检查机制的缺陷吗?
测试:
$ clang-3.3 -Weverything -g -O0 -fsanitize=undefined -fsanitize=null -fsanitize=address offsetnull.c -o offsetnull
$ ./offsetnull
c: 0xffffffffffffffff
$ gcc-4.8 -g -O0 -fsanitize=address offsetnull.c -o offsetnull
$ ./offsetnull
c: 0xffffffffffffffff
Run Code Online (Sandbox Code Playgroud)
似乎很好地记录了Clang和GCC使用的AddressSanitizer更侧重于解除坏指针的引用,所以这很公平.但其他检查也没有抓住它: - /
编辑:我问这个问题的部分原因是-fsanitize标志能够动态检查生成的代码中的良好定义.这是他们应该抓住的东西吗?
我正在为并行程序开发一个运行时系统,它可以利用跨多个进程的公共地址空间布局,可能分布在几千个节点上.很多时候,为此环境构建的软件在默认启用地址空间随机化的Linux系统上运行,用户可能不希望或无法在系统范围内禁用它(通过sysctl -w kernel.randomize_va_space=0等).这对并行程序施加了一些限制,并且可能损害性能.因此,我们想弄清楚如何为我们构建的二进制文件禁用它.安全性不是问题,因为该软件始终在受控环境中运行.
我发现了对各种标志和变量的引用,比如ET_EXEC,EF_AS_NO_RANDOM(显然从未合并过?)和PF_RANDOMIZE,但我找不到任何描述我可以做什么来设置这些标志的文档.一个理想的答案会告诉我什么编译器/汇编器/链接器标志将禁用生成的二进制文件的随机化,以及它工作的工具链/内核的版本.接下来最好的是在构建二进制文件后执行相同操作的工具.
由于我确信有人会提出建议,我已经知道我们可以在运行时进行此更改setarch -R,但最好将其记录在可执行文件中.
看起来paxctl -rx应该做的伎俩,但它似乎不适用于不包含PaX补丁的内核中使用的当前方法.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html
上述"保证副本Elision"提案在2016年6月在芬兰奥卢举行的会议上被投票选入C++工作文件,然后被投票作为委员会草案出版.希望明年能够成为C++ 17标准的出版物.
该提案阐明了涉及临时对象的各种值类别,以在某些用例中强制执行复制构造函数调用.
我的问题是"这些新要求可能会破坏编译器的ABI兼容性,这些编译器可能以前没有在这些情况下完成复制,或者是以不符合新要求的方式实现的吗?"
我正在考虑初始化之类的东西,当创建对象时可以内联,而不是在跨越编译单元边界时.
我很惊讶我找不到任何文件说明Valgrind 工具的输出_int_malloc和malloc输出之间的区别callgrind.
有人可以解释一下他们的区别吗?
此外,我实际上编写C++代码,所以我完全new不使用malloc,但在callgrind输出中只显示mallocs.
我正在处理一些包含表单表达式的代码
-(sizeof(struct foo))
Run Code Online (Sandbox Code Playgroud)
即a的否定,size_t我不清楚编译器在看到这个时C和C++标准需要什么.具体来说,从此处和其他地方四处查看,sizeof返回类型的无符号整数值size_t.当否定无符号整数时,我找不到任何指定行为的明确引用.有没有,如果有的话,它是什么?
编辑:好的,所以关于无符号类型的算术有一些很好的答案,但事实并非如此.如果否定,它是在无符号整数上运行,还是转换为有符号类型并对其执行某些操作?从标准中预期的行为是"想象它是相似幅度的负数,然后对无符号值应用'溢出'规则"?
因此,C++标准要求类成员按照它们在类中声明的顺序进行初始化,而不是在任何构造函数的初始化列表中提及它们的顺序.但是,这并不意味着评估这些初始化的参数的顺序.我正在使用一个经常传递对序列化对象的引用的系统,并想知道我是否可以确保以正确的顺序从中读取位,而不管这些位写入对象字段的顺序.
struct Foo {
int a;
double b;
// I want to be able to do this
Foo(SerObj &s)
: b(s.readDouble()), a(s.readInt())
{ }
// Rather than this
Foo (SerObj &s)
{
b = s.readDouble();
a = s.readInt();
}
};
Run Code Online (Sandbox Code Playgroud)
显然,重新排序ints和doubles声明中的内容并不是一件大事,但更大的对象和需要动态分配的东西有时也可以.
c++ constructor initialization operator-precedence ctor-initializer
我试图在c ++中设计一个允许并发访问的链表.显然,对于该列表使用单个锁是非常低效的,因为可以并行更新不相交的区域.现在除了每个节点存储一个锁之外,还有什么选择?
另外,在这种情况下,非阻塞版本会更好吗?任何相关链接,任何人?
编辑:感谢您的回复.我想补充一些事情:
c++ ×6
c ×3
linux ×2
abi ×1
aslr ×1
azure ×1
c++17 ×1
constructor ×1
conventions ×1
copy-elision ×1
gcc ×1
hpc ×1
infiniband ×1
kernel ×1
malloc ×1
null-pointer ×1
pthreads ×1
size-t ×1
sizeof ×1
unsigned ×1
valgrind ×1