# CUDA語義
# CUDA語義
`torch.cuda`會記錄當前選擇的GPU,并且分配的所有CUDA張量將在上面創建。可以使用`torch.cuda.device`上下文管理器更改所選設備。
但是,一旦張量被分配,您可以直接對其進行操作,而不考慮所選擇的設備,結果將始終放在與張量相同的設備上。
默認情況下,不支持跨GPU操作,唯一的例外是`copy_()`。 除非啟用對等存儲器訪問,否則對分布不同設備上的張量任何啟動操作的嘗試都將會引發錯誤。
下面你可以找到一個展示如下的小例子:
```
x = torch.cuda.FloatTensor(1)
# x.get_device() == 0
y = torch.FloatTensor(1).cuda()
# y.get_device() == 0
with torch.cuda.device(1):
# allocates a tensor on GPU 1
a = torch.cuda.FloatTensor(1)
# transfers a tensor from CPU to GPU 1
b = torch.FloatTensor(1).cuda()
# a.get_device() == b.get_device() == 1
c = a + b
# c.get_device() == 1
z = x + y
# z.get_device() == 0
# even within a context, you can give a GPU id to the .cuda call
d = torch.randn(2).cuda(2)
# d.get_device() == 2
```
## 最佳實踐
### 使用固定的內存緩沖區
當副本來自固定(頁鎖)內存時,主機到GPU的復制速度要快很多。CPU張量和存儲開放了一個`pin_memory()`方法,它返回該對象的副本,而它的數據放在固定區域中。
另外,一旦固定了張量或存儲,就可以使用異步的GPU副本。只需傳遞一個額外的`async=True`參數到`cuda()`的調用。這可以用于將數據傳輸與計算重疊。
通過將`pin_memory=True`傳遞給其構造函數,可以使`DataLoader`將batch返回到固定內存中。
### 使用 nn.DataParallel 替代 multiprocessing
大多數涉及批量輸入和多個GPU的情況應默認使用`DataParallel`來使用多個GPU。盡管有GIL的存在,單個python進程也可能使多個GPU飽和。
從0.1.9版本開始,大量的GPU(8+)可能未被充分利用。然而,這是一個已知的問題,也正在積極開發。和往常一樣,測試你的用例吧。
調用`multiprocessing`來利用CUDA模型存在重要的注意事項;使用具有多處理功能的CUDA模型有重要的注意事項; 除非就是需要謹慎地滿足數據處理需求,否則您的程序很可能會出現錯誤或未定義的行為。
- PyTorch 中文文檔
- 主頁
- 自動求導機制
- CUDA語義
- 擴展PyTorch
- 多進程最佳實踐
- 序列化語義
- torch
- torch.Tensor
- torch.Storage
- torch.nn
- torch.nn.functional
- torch.autograd
- torch.optim
- torch.nn.init
- torch.multiprocessing
- torch.legacy
- torch.cuda
- torch.utils.ffi
- torch.utils.data
- torch.utils.model_zoo
- torchvision
- torchvision.datasets
- torchvision.models
- torchvision.transforms
- torchvision.utils
- 致謝