加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:44:11 所属栏目:百科 来源:网络整理
导读:我目前将算法移植到两个GPU.硬件具有以下设置: 两个CPU作为NUMA系统,因此主存储器分为两个NUMA 节点. 每个GPU物理连接到其中一个GPU. (每个PCIe控制器都有一个GPU) 我在主机上创建了两个线程来控制GPU.线程每个都绑定到NUMA节点,即两个线程中的每一个都在一
我目前将算法移植到两个GPU.硬件具有以下设置:

>两个CPU作为NUMA系统,因此主存储器分为两个NUMA
节点.
>每个GPU物理连接到其中一个GPU. (每个PCIe控制器都有一个GPU)

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

解决方法

正如我在评论中提到的,这是一种CPU GPU亲和力.这是我一起攻击的bash脚本.我相信它会在RHEL / CentOS 6.x操作系统上提供有用的结果.它可能无法在许多旧的或其他 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读