gpt4 book ai didi

c++ - SGE 中 SGI 机器上的 CPU 负载失控

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:19 26 4
gpt4 key购买 nike

我们在 sgi uv 2000 (smp) 上运行 oge 2011.11 w 256 个超线程内核(128 个物理内核)。当我们在系统上运行 openmp 作业时,它运行良好。这是工作:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <math.h>
#include <omp.h>

using namespace std;

int main (
int argc,
char* argv[] ) {


#if _OPENMP
// Show how many threads we have available
int max_t = omp_get_max_threads();
cout << "OpenMP using up to " << max_t << " threads" << endl;
#else
cout << "!!!ERROR!!! Program not compiled for OpenMP" << endl;
return -1;
#endif

const long N = 115166;
const long bytesRequested = N * N * sizeof(double);

cout << "Allocating " << bytesRequested << " bytes for matrix" << endl;

double* S = new double[ N * N ];

if( NULL == S ) {
cout << "!!!ERROR!!! Failed to allocate " << bytesRequested << " bytes" << endl;
return -1;
}

cout << "Entering main loop" << endl;

#pragma omp parallel for schedule(static)
for ( long i = 0; i < N - 1; i++ ) {
for ( long j = i + 1; j < N; j++ ) {
#if _OPENMP
int tid=omp_get_thread_num();
if( 0 == i && 1 == j ) {
int nThreads=omp_get_num_threads();
cout << "OpenMP loop using " << nThreads << " threads" << endl;
}
#endif

S[ i * N + j ] = sqrt( i + j );
}
}

cout << "Loop completed" << endl;
delete S;
return 0;
}

这是它正在执行的:

[c++]$ ./OMP测试OpenMP 使用多达 256 个线程为矩阵分配 106105660448 字节进入主循环使用 256 个线程的 OpenMP 循环循环完成

但是,当我使用以下(以及迄今为止的任何)并行环境在队列中提交它时,CPU 上的负载猛增(远超过 256),系统变得完全没有响应,必须断电循环。这是我的 pe 环境:

[c++]$ qconf -sp 线程化pe_name 线程插槽 10000user_lists 无xuser_lists 无start_proc_args/bin/true停止_proc_args/bin/true分配规则 $pe_slotscontrol_slaves 假job_is_first_task TRUEurgency_slots 分钟accounting_summary 真

我已经更改了 control_slaves、job_is_first_task、插槽(减少到 140 以下,任何超过 140 的东西都会出现前面描述的失控负载情况)我什至使用了我创建的不同并行环境。我还将队列中的插槽数减少到 140,但负载仍然跑掉并锁定机器。最后,我尝试了无数次迭代,但这是我的 qsub 脚本:

#!/bin/sh
#$ -cwd
#$ -q sgi-test
## email on a - abort, b - begin, e - end
#$ -m abe
#$ -M <email address>
#source ~/.bash_profile
## for this job, specifying the threaded environment w a "-" ensures the max number of processors is used
#$ -pe threaded -
echo "slots = $NSLOTS"
export OMP_NUM_THREADS=$NSLOTS
echo "OMP_NUM_THREADS=$OMP_NUM_THREADS"
echo "Running on host=$HOSTNAME"
## memory resource request per thread, max 24 for 32 threads
#$ -l h_vmem=4G
##$ -V
##this environment variable setting is needed only for OpenMP-parallelized applications
## finally! -- run your process
<path>/OMPtest

最后,由于无限的处理器/插槽总是使机器崩溃,我指定:

    #$ -pe threaded 139

任何高于 139 的值都会使机器崩溃,但 mcelog 或/var/log/messages 中没有输出。任何对可能发生的事情的洞察力都将不胜感激!

最佳答案

自己解决了。在脚本中添加了“-V”选项以将我的环境变量推送到 oge/sge,因为作业在我的调度程序之外的环境中运行得很好。它每次都运行而没有崩溃。可以通过消除/试错过程找出导致问题的变量,但我有很多变量。总而言之,“-V”修复了很多问题,尤其是当您的作业在 OGE/SGE 之外运行良好时。

关于c++ - SGE 中 SGI 机器上的 CPU 负载失控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39666681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com