草庐IT

intel-mpi

全部标签

c++ - 循环地址对齐如何影响 Intel x86_64 上的速度?

我看到编译为完全相同的机器指令但位于不同对齐地址的相同C++代码的性能下降了15%。当我的微型主循环从0x415220开始时,它比从0x415250开始时更快。我在IntelCore2Duo上运行它。我在x86_64Ubuntu上使用gcc4.4.5。谁能解释减速的原因以及我如何强制gcc以最佳方式对齐循环?下面是两种情况的反汇编,带有探查器注释:41522057612.56%|XXXXXXXXXXXXXX48c1eb08shr$0x8,%rbx4152241102.40%|XX0fb6c3movzbl%bl,%eax4152270.00%|410fb60400movzbl(%r8,%

c++ - 如何在函数中初始化 MPI?

我想在一个函数中使用多进程,我该怎么做。如您所知,MPI_Init需要两个参数:“intargc,char**argv”。这是否意味着我必须在函数定义中添加这两个参数?我的要求是我想并行化函数中的一个步骤,而不是主程序中的一个步骤。例如,func(mat&A,vec&x){somecomputationonA;autoB=sub_mat(A,0,10);B*x;//Iwanttoparallelizethiscomputation}main(){matA;vecx;func(A,x);}我只想在B*x中使用MPI,但我不知道如何初始化MPI?顺便说一句,如果我可以初始化MPIintfu

c++ - g++ vs intel/clang 参数传递顺序?

考虑以下代码(LWS):#include#includeinlinevoidtest(conststd::chrono::high_resolution_clock::time_point&first,conststd::chrono::high_resolution_clock::time_point&second){std::cout您必须多次运行它,因为有时并没有明显的区别。但是当first和second的计算时间存在明显差异时,g++下的结果如下:13633762393631751363376239363174以及intel和clang下的以下内容:13633762679714

c++ - MPI:更改 CMakelist 中的处理器数量

我正在使用CLion。我的CMakeLists.txt看起来像这样:cmake_minimum_required(VERSION3.2)project(MPI)add_executable(MPImain.cpp)#RequireMPIforthisproject:find_package(MPIREQUIRED)set(CMAKE_CXX_COMPILE_FLAGS${CMAKE_CXX_COMPILE_FLAGS}${MPI_COMPILE_FLAGS})set(CMAKE_CXX_LINK_FLAGS${CMAKE_CXX_LINK_FLAGS}${MPI_LINK_FLAGS}

c++ - 当数据隐藏在对象中时如何使用 intel prefetch pragma?

Intel提供了预取编译指示,很有帮助;例如#pragmaprefetchafor(i=0;i将预取a一定数量的循环周期,由编译器决定。但是如果a不是一个数组而是一个覆盖了[]的类呢?如果operator[]做一个简单的数组访问,prefetch还能这样用吗?(大概这个问题也适用于std::vectors)。 最佳答案 找出答案的一种方法是尝试并查看程序集。如果还有其他问题,只需使用和不使用pragma对其进行基准测试。但是,我不确定prefetchpragma是否是您想要的:Theprefetchpragmaissupported

c++ - 在 mpi 中定义全局变量

我在下面写了一个示例代码:#include#includedoublex;intmain(intargc,char**argv){MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&size);if(rank==0)x=10.1;MPI_Barrier(MPI_COMM_WORLD);printf("%f\n",x);MPI_Finalize();return0;}您可能会注意到,该程序实际上定义了一个名为x的全局变量,第零个线程试图为其分配一些值。当我在具有4个

c++ - Intel Inspector 报告我的自旋锁实现中存在数据竞争

我使用Windows中的Interlocked函数制作了一个非常简单的自旋锁,并在双核CPU上对其进行了测试(两个线程递增一个变量);该程序似乎运行正常(它每次都给出相同的结果,当没有使用同步时情况并非如此),但是IntelParallelInspector说在value+=j(见下面的代码)。当使用关键部分而不是我的SpinLock时,警告消失。我的SpinLock实现是否正确?这真的很奇怪,因为所有使用的操作都是原子的并且有适当的内存屏障,它不应该导致竞争条件。classSpinLock{int*lockValue;SpinLock(int*value):lockValue(val

c++ - MPI 中 vector 的使用(C++)

我是MPI编程的新手,仍在学习,我成功地通过定义结构创建了派生数据类型。现在我想在我的结构中包含Vector并希望跨流程发送数据。例如:structStructure{//ConstructorStructure():X(nodes),mass(nodes),ac(nodes){//codetocalculatethemassandaccelerations}//DestructorStructure(){}//Variablesdoubleradius;doublevolume;vectormass;vectorarea;//andsomeothervariables//Method

c++ - 使用 gtest 对 MPI 程序进行单元测试

我正在并行化一个已存在的应用程序,该应用程序将gTest与MPI结合使用。在MPI程序中,首先要做的是通过调用来初始化环境MPI_Init(int*argc,char***argv)在MPI程序结束时,根进程也应该调用MPI_Finalize。我如何使用GoogleTest为此类应用程序编写单元测试?特别是,在gTest修改它们之前,我如何从测试中访问argc和argv。现在我在做:intargc=0;char**argv=NULL;boost::mpi::environmentenv(argc,argv);TEST(component_test,test_name){//stuffu

c++ - 当我们使用 mpi_send/receive 函数时到底发生了什么?

当我们使用mpi_send/receive函数时会发生什么?我的意思是这种通信是通过我们希望发送和接收的变量的值或地址完成的(例如进程0想要发送变量“a”到进程1。进程0究竟发送变量“a”的值或地址的“一个”)。当我们使用派生数据类型进行通信时会发生什么? 最佳答案 幕后发生了相当多的魔法。首先是意外消息队列。当发送方在接收方调用MPI_Recv之前调用MPI_Send时,MPI不知道消息将发送到接收方内存中的哪个位置。此时可能会发生两件事。如果消息很短,它会被复制到接收方的临时缓冲区中。当接收方调用MPI_Recv时,它首先检查匹