gpt4 book ai didi

c - 在 NUMA 机器上使用 CUDA 进行多 GPU 编程

转载 作者:太空狗 更新时间:2023-10-29 15:58:45 27 4
gpt4 key购买 nike

我目前正在将算法移植到两个 GPU。硬件具有以下设置:

  • 两个 CPU 作为一个 NUMA 系统,所以主内存被分成两个 NUMA节点。
  • 每个 GPU 都物理连接到其中一个 GPU。 (每个 PCIe Controller 有一个 GPU)

我在主机上创建了两个线程来控制 GPU。每个线程都绑定(bind)到一个 NUMA 节点,即两个线程中的每一个都在一个 CPU 插槽上运行。如何确定 GPU 的数量,以便我可以使用 cudaSetDevice() 选择直接连接的 GPU?

最佳答案

正如我在评论中提到的,这是一种 CPU GPU 亲和性。这是我一起破解的 bash 脚本。我相信它会在 RHEL/CentOS 6.x OS 上提供有用的结果。它可能无法在许多旧版或其他 Linux 发行版上正常运行。您可以像这样运行脚本:

./gpuaffinity > out.txt

然后您可以在程序中读取 out.txt 以确定哪些逻辑 CPU 核心对应于哪些 GPU。例如,在具有两个 6 核处理器和 4 个 GPU 的 NUMA Sandy Bridge 系统上,示例输出可能如下所示:

0     03f
1 03f
2 fc0
3 fc0

该系统有 4 个 GPU,编号从 0 到 3。每个 GPU 编号后跟一个“核心掩码”。核心掩码对应于“接近”特定 GPU 的核心,表示为二进制掩码。因此对于 GPU 0 和 1,系统中的前 6 个逻辑核心(03f 二进制掩码)最接近。对于 GPU 2 和 3,系统中的第二个 6 个逻辑核心(fc0 二进制掩码)最接近。

您可以在程序中读取文件,也可以使用脚本中说明的逻辑在程序中执行相同的功能。

您也可以像这样调用脚本:

./gpuaffinity -v

这会给出更详细的输出。

这是 bash 脚本:

#!/bin/bash
#this script will output a listing of each GPU and it's CPU core affinity mask
file="/proc/driver/nvidia/gpus/0/information"
if [ ! -e $file ]; then
echo "Unable to locate any GPUs!"
else
gpu_num=0
file="/proc/driver/nvidia/gpus/$gpu_num/information"
if [ "-v" == "$1" ]; then echo "GPU: CPU CORE AFFINITY MASK: PCI:"; fi
while [ -e $file ]
do
line=`grep "Bus Location" $file | { read line; echo $line; }`
pcibdf=${line:14}
pcibd=${line:14:7}
file2="/sys/class/pci_bus/$pcibd/cpuaffinity"
read line2 < $file2
if [ "-v" == "$1" ]; then
echo " $gpu_num $line2 $pcibdf"
else
echo " $gpu_num $line2 "
fi
gpu_num=`expr $gpu_num + 1`
file="/proc/driver/nvidia/gpus/$gpu_num/information"
done
fi

关于c - 在 NUMA 机器上使用 CUDA 进行多 GPU 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056800/

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