hpc 相关问题

高性能计算(HPC)是指使用超级计算机和计算机集群来解决各种计算密集型问题。


SnakeMake:与Slurm

llet说我们有一个简单的管道如下:

回答 0 投票 0

在C语言中使用OpenMP中的包含扫描语法

包含操作的定义如下:对于输入向量说

回答 1 投票 0







评估通信对 MPI 程序运行时的贡献

背景 假设我有一个复杂的 MPI 程序,其中包含多个消息传递事件和计算。通信模式是双向环消息传送,如下图所示...

回答 1 投票 0

HPC 上的 mpiexec 错误:文件 srun 上的 execvp 错误(没有此类文件或目录)

在HPC上,我先测试一下 apptainer exec my_container bash -c“激活环境;python3 script.py” 效果很好。 如果我以交互方式使用终端,它也可以很好地工作,例如: 应用泰...

回答 1 投票 0

在多个文件上运行 SLURM 的最简单方法

我有一个 Python 脚本,可以逐个处理大约 10,000 个 FITS 文件。对于每个文件,脚本都会在与输入文件相同的目录中生成输出,并创建单个 CSV 文件...

回答 1 投票 0

程序员在编写Python代码时是否需要手动实现循环展开等优化?

我最近在学习一些 HPC 主题,并了解到现代 C/C++ 编译器能够检测有权优化的位置,并使用相应的技术(例如 SIMD)进行优化...

回答 1 投票 0

从不同文件作为单个批处理作业提交太多命令

我想使用 bash 在 HPC 上运行批处理作业。要执行的命令保存到文本文件中。以前,我使用以下命令将文本文件的每一行作为批处理作业单独运行。 ...

回答 1 投票 0

Openmp 递归任务

我是 Openmp 编程新手,我有一个关于递归任务并行性的问题 让我们考虑一下这个演示 C 代码: #包括 #包括 #包括 我是 Openmp 编程新手,我有一个关于递归任务并行性的问题 让我们考虑一下这个演示 C 代码: #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <omp.h> struct timeval t1, t2; void recursive_task(int level) { //printf("%d\n", level); if (level == 0){ usleep(1000); return; } else { recursive_task(level-1); #pragma omp task { recursive_task(level-1); } #pragma omp task { recursive_task(level-1); } #pragma omp taskwait recursive_task(level-1); } } int main() { double time; gettimeofday(&t1, 0); #pragma omp parallel { #pragma omp single { recursive_task(7); } } gettimeofday(&t2, 0); time = (double)((t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec) / 1000000; printf("%.4f\n", time); return 0; } 每一级递归执行 4 次调用,其中只有第二次和第三次调用可以实际并行运行。 现在我尝试了这个不同的版本: #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <omp.h> struct timeval t1, t2; void recursive_task(int level) { //printf("%d\n", level); if (level == 0){ usleep(1000); return; } else { #pragma omp task if(0) { recursive_task(level-1); #pragma omp task { recursive_task(level-1); } recursive_task(level-1); #pragma omp taskwait recursive_task(level-1); } } } int main() { double time; gettimeofday(&t1, 0); #pragma omp parallel { #pragma omp single { recursive_task(7); } } gettimeofday(&t2, 0); time = (double)((t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec) / 1000000; printf("%.4f\n", time); return 0; } 执行似乎也遵循正确的调用顺序(我认为这与 if(0) 子句有关)。 然而令我惊讶的是第二个比第一个更快。我使用 8 个线程执行,第一种方法需要 4.4 秒,第二种方法需要 3.4 秒! 使第二个代码更快的主要区别是什么? 重点是影响#pragma omp taskwait等待当前任务的子任务完成,当有使用#pragma omp task if(0)创建的任务时,当前任务不一样。这意味着“不”拥有较晚的指令会导致“过度同步”,从而导致更高的执行时间(当然是由于并行性较低)。事实上,在这种情况下, #pragma omp taskwait 指令会等待更多任务(尤其是没有 if(0) 的真实任务。 2 个级别的示例 为了更好地理解发生了什么,我们可以分析该函数在级别 2 上到底做了什么(并将延迟增加到 10_000,以便我们可以在运行时看到任何差异)。这是扁平化代码: void recursive_task_level2() { #pragma omp task if(0) { #pragma omp task if(0) { usleep(10000); #pragma omp task usleep(10000); usleep(10000); #pragma omp taskwait usleep(10000); } #pragma omp task // <----- [A] WAITED TASK { #pragma omp task if(0) { usleep(10000); #pragma omp task usleep(10000); usleep(10000); #pragma omp taskwait usleep(10000); } } #pragma omp task if(0) // <----- [B] IMPORTANT ONE { usleep(10000); #pragma omp task usleep(10000); usleep(10000); #pragma omp taskwait // <----- [C] usleep(10000); } #pragma omp taskwait #pragma omp task if(0) { usleep(10000); #pragma omp task usleep(10000); usleep(10000); #pragma omp taskwait usleep(10000); } } } 这个想法是:如果 [B] 存在,那么 [C] 不会等待 [A],因为它不再是子任务;但是,如果 [B] 不存在,则 [C] 等待 [A],即等待 10 毫秒之前。通过在有/没有 [B] 以及有/没有所有其他 #pragma omp task if(0) 的情况下运行此代码来确认此效果。在这种情况下,唯一重要的指令是 [B],而注释 [B] 确实会增加执行时间 10 毫秒(92 毫秒 vs 102 毫秒)。这证明了假设是正确的。随着级别的增加,由于过度同步,并行量会大大减少,并且额外的时间也会在关键路径上累积(当然是指数级的),从而导致巨大的执行开销。

回答 1 投票 0

英特尔 mpicc 链接器错误未定义对 `_mm_idivrem_epi32' 的引用

我正在尝试使用版本11.1 20090511在具有MPICC的集群上编译milcv7.7.8/ks_spectrum的源代码,然后通过“make ks_spectrum_hisq”命令在milcv7.7.8/ks_spectrum中创建源代码...

回答 1 投票 0

R 是否将计算限制在单个核心?可以吗?

已经有一段时间了,我的记忆已经模糊了,但我记得当我在 HPC 上使用 Matlab 时,我必须明确告诉 Matlab 不要使用比我的工作要求更多的线程,否则 Matlab 会吃掉

回答 1 投票 0

Slurm:使用多个节点的核心进行 Python 并行化

这个问题与这个问题有些相似, Slurm:使用多个节点的核心进行 R 并行化 但这是针对Python的。 我有一个可以在 PC 上使用多个内核的 python 程序,它确实...

回答 1 投票 0

dpdk 和 rdma 的根本区别是什么?

我只知道DPDK背后的核心思想是绕过内核网络堆栈,直接在用户空间中访问和处理网络数据包。 RDMA只是在用户空间和网卡之间进行...

回答 1 投票 0

如何在LSF中限制用户访问或为特定用户保留队列?

我目前正在使用 LSF(负载共享设施)集群,需要限制对名为 bhigh 的特定队列的访问。我想确保只有某些用户可以向此队列提交作业...

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.