假设我有一个类似的功能:
template<typename It, typename Cmp>
void mysort( It begin, It end, Cmp cmp )
{
std::sort( begin, end, cmp );
}
Run Code Online (Sandbox Code Playgroud)
当我使用-finstrument-functions-after-inliningwith编译它时clang++ --version:
clang version 11.0.0 (...)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: ...
Run Code Online (Sandbox Code Playgroud)
仪器代码爆炸了执行时间,因为每次调用我的入口和出口函数
void std::__introsort_loop<...>(...)
void std::__move_median_to_first<...>(...)
Run Code Online (Sandbox Code Playgroud)
我正在对一个非常大的数组进行排序,所以我的程序没有完成:没有检测它需要大约 10 秒,使用检测我在 10 分钟时取消它。
我已经尝试添加__attribute__((no_instrument_function))到mysort(以及调用 的函数mysort),但是就这些标准库调用而言,这似乎没有影响。
有谁知道是否可以忽略标准库函数内部的函数检测,例如std::sort?理想情况下,我只会mysort检测,所以一个入口和一个出口!
我看到clang++遗憾的是还没有支持像finstrument-functions-exclude-function-listor 之类的东西finstrument-functions-exclude-file-list,但g++还没有支持-finstrument-functions-after-inlining我理想中的东西,所以我被卡住了!
编辑:玩多了之后,似乎对执行时间的影响实际上比描述的要少,所以这不是世界末日。然而,问题仍然存在,因为大多数进行函数检测的clang人只关心应用程序代码,而不关心那些从(例如)标准库链接的函数。
EDIT2:为了进一步突出问题,因为我已经在合理的时间范围内运行了它:我从使用这两个标准库函数的检测代码生成的结果跟踪是 15GB。当我对跟踪进行硬编码以忽略这两个函数地址时,生成的跟踪为 3.7MB!
我想知道是否有人可以对c ++中的内存释放进程有所了解.
如果我有一个我声明为静态的结构,那么它的构造函数是第一个执行的东西,它的析构函数是最后执行的东西:
struct initializer execute_before_and_after_main {
initializer() { init(); }
~initializer() { cleanup(); }
}
static initializer execute_around_main;
Run Code Online (Sandbox Code Playgroud)
然后我有类似的东西:
class my_class {
my_object objects[100];
}
extern my_class gobal_my_class;
my_class global_my_class;
Run Code Online (Sandbox Code Playgroud)
主要在这里并不重要:
int main (int argc, char* argv[]) {
....
}
Run Code Online (Sandbox Code Playgroud)
当cleanup()被调用时,是objects现在含有解除分配的/无效的存储器阵列?是否存在c ++在此实现的标准初始化/破坏序列,有人可能指向我?
谢谢
编辑:我理解这种类型的代码可能不是最佳实践,但我仍然想知道行为是否已定义.
我试图跨异构集群执行MPI程序,一个运行Ubuntu 12.04(64位),另一个运行CentOS 6.4(64位).
我在CentOS上编译一个简单的MPI程序,将其转换为Ubuntu,并测试它是否适用于每台机器本地的1个或多个MPI进程.我可以确认它分别适用于每个.
当我尝试在两台机器上执行程序时,我在MPI_Wait上收到"消息截断"错误.我相信这告诉我,1台机器发送的字节数比接收机器准备好的更多/更少.
该程序(代码段):
if(rank==0){
taskobject_id[0] = 4;
taskobject_id[1] = 5;
MPI_Request* req = new MPI_Request();
MPI_Isend(&taskobject_id, 2, MPI_INT, 1, 0, MPI_COMM_WORLD, req);
MPI_Status stat;
MPI_Wait(req, &stat);
}
else if(rank==1){
taskobject_id[0] = 1;
taskobject_id[1] = 1;
MPI_Request* req = new MPI_Request();
MPI_Irecv(&taskobject_id, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, req);
MPI_Status stat;
MPI_Wait(req, &stat);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:每台机器是否在通信中评估要发送/接收的不同字节数?MPI_INT是否依赖于机器?
如果是这样,有没有人有任何指示,我应该怎么做才能解决这个问题?
编辑:当count = 8且类型为MPI_BYTE时,问题仍然存在.我不知所措.
EDIT2:有趣的是,交换排名时不会出现问题.从测试开始,操作与接收操作比发送操作发送的计数更高的操作相同.因此很明显,CentOS机器认为MPI_INT的1个数量小于Ubuntu机器认为的数量.
当接收者计数>发送者计数时,等待操作完成并且代码继续,但MPI_Barrier导致程序挂起,即使两个等级都被确认为"进入"障碍
谢谢!
我的工作假设MPI流程从头到尾运行独立且独特的数据,即使在同一台机器上也是如此.但是我的代码,我希望每个MPI进程都有一个全局对象:
class global { // the class };
extern global obj;
global obj;
int main( int argc, char * argv[] ) {
MPI_Init();
// determine rank
std::cout << rank << " global object is at " << &obj << std::endl;
MPI_Finalize();
}
Run Code Online (Sandbox Code Playgroud)
使用-np 2,结果为:
0 global object is at 0x620740
1 global object is at 0x620740
Run Code Online (Sandbox Code Playgroud)
这可能是分段错误或其他错误的来源,其中两个MPI进程在同一台机器上访问相同的内存地址以获取其自己的全局对象吗?
编辑:我应该提一下,我的意图中的"全球"并非全球所有MPI流程,而是在每个单独的MPI流程中全球化.
我正在尝试确定发送操作和接收操作的哪些参数必须匹配要传递的消息.
我知道接收操作必须匹配(或包含)消息的来源,标记和通信器.但是,数据类型是否需要匹配?
我可以匹配0级的发送:
MPI_Send (send_buffer, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)
在1级接收操作:
MPI_Recv (recv_buffer, 4, MPI_BYTE, 0, 0, MPI_COMM_WORLD, status);
Run Code Online (Sandbox Code Playgroud)
特别是因为发送'计数'小于接收计数,我知道它对MPI有效.
谢谢.
我正在研究用C++构建的复杂任务调度系统的扩展.我需要能够在集群中的节点之间发送连续的字节序列(其中我有起始内存地址和数据的字节长度).
问题是,我不知道需要发送的对象的数据类型.事实上,我不认为我在乎,因为我只是在节点内发送内存地址(两者都事先知道类型是什么).
所以我的问题是:是否存在MPI_NULL数据类型,或者在这种情况下是否是任意数据类型声明?任何帮助深表感谢.
谢谢.