2016-02-29 125 views
-1

我想澄清以下問題。我能夠訪問包含了Nvidia K40 GPU和Intel Xeon E5 processor.The處理器細節單個節點使用lscpu命令得到如下:CUDA MPI性能瓶頸

Architecture:   x86_64 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    32 
On-line CPU(s) list: 0-31 
Thread(s) per core: 1 
Core(s) per socket: 8 
Socket(s):    4 
NUMA node(s):   4 
Vendor ID:    GenuineIntel 
CPU family:   6 
Model:     62 
Stepping:    4 
CPU MHz:    2300.201 
BogoMIPS:    4599.40 
Virtualization:  VT-x 
L1d cache:    32K 
L1i cache:    32K 
L2 cache:    256K 
L3 cache:    16384K 
NUMA node0 CPU(s):  0-7 
NUMA node1 CPU(s):  8-15 
NUMA node2 CPU(s):  16-23 
NUMA node3 CPU(s):  24-31 

我運行MPI程序橫跨32分配工作處理器的核心。每個核心然後將一部分部分卸載到GPU。在運行代碼時,性能會下降(執行時間增加)而不是減少?是否因爲內核對GPU的訪問被序列化?我只想澄清這個概念,因此我沒有發佈任何代碼。我已經閱讀了關於CUDA意識的MPI,但我認爲它在這種情況下沒有多大用處,因爲它更適用於多節點情況。如果我錯了,請糾正我。在這些情況下改善績效的可能方法有哪些?

回答

3

是否因爲內核對GPU的訪問正在被序列化?

這有可能是在GPU上的序列化可能會以某種方式有助於你在觀察什麼,除非你採取特殊措施。 MPI創建了多個進程。一個常見的策略是爲每個CPU核創建一個進程。來自單獨進程(針對單個GPU)的CUDA活動通常會在該GPU上進行序列化。

有什麼方法可以改善這種情況下的性能?

CUDA MPS是專門爲這種情況設計的。它允許從單獨進程發出的GPU活動表現得好像它們都來自同一進程。這可以有多種類型的效率優勢(例如,GPU上沒有上下文切換,可以同時運行某些GPU內核等),但是我不想誇大功能。只有通過嘗試才能確定它是否有助於您的情況。

如果你在GPU上投入大量的工作(每MPI級別),當然期望任意線性縮放是不合理的。一旦GPU處於飽和狀態,如果GPU成爲瓶頸,事情就不會變得更快,額外的MPI等級服務開銷可能實際上也會減慢速度。

This presentation,從第40張幻燈片開始,在此場景中提供了大量關於MPS的有用信息。

請注意,我主要關注GPU方面。通常,MPI代碼可能無法顯示線性縮放(甚至可能因MPI開銷和其他因素而減慢速度),因爲您將MPI等級計數從1擴展到系統上「處理器」的總數。可以有許多原因,什麼都沒有做與GPU:

  1. 進程放置/親和力
  2. 飽和的CPU
  3. 用在HPC代碼「超線程」核常節目的內存帶寬沒有好處或負面影響。

而且我相信還有很多其他的可能性。所以你的性能下降完全可能與GPU沒有任何關係(如果它不是瓶頸),並且是由於其他因素造成的。您可以使用分析工具獲得最初的想法,上面的鏈接演示提供了一些想法。