開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
CUDA
問題(Question):
由於專題需要 自學CUDA
但是遇到一些困擾
1. 一個block最多只能512個thread
所以如果要更多thread 需要用多block
可是 grid呢? 為何還需要分grid?
2. CUDA 是 SIMT 單指令多執行緒
是一個thread 對應 一個指令如 + or * ?
可是如果我要同時有乘和加 我要如何寫?
直接寫+和* compiler 會幫我分配給thread?
ex. 矩陣相加是
int i = threadIdx.x <----這裡是否要改成 const int i = threadIdx.x?
C[i] = A[i] + B[i]
如果寫成
for (int i = 0; i < N; i++)
C[i] = A[i] + B[i]
是否等同上面的寫法? 每個thread做一個 +法
因為實在不知道 compiler 會幫我處裡的甚麼程度?
因我看別人寫矩陣相乘有用到for-loop感覺很奇怪
是寫
const int tid = threadIdx.x;
const int bid = blockIdx.x;
const int idx = bid * blockDim.x + tid;
const int row = idx / n;
const int column = idx % n;
float temp;
for(int i = 0; i < n; i++)
temp += a[row * N + i] * b[i * N + column];
c[row * N + column] = temp;
3. 如上面寫在globel的程式碼 float temp = 0;
temp 這個是佔顯示卡的記憶體還是main memory的?
4. 關於硬體上的SP和SM
硬體和軟體定義上
一個SP同時處理一個thread
一個SM負責最多8個block 同時處裡一個block
而一個SM有8個SP 而執行的thread是以1 warp = 32 thread為單位
可是這就有對應上的問題 一個SM最多同時處裡8個thread 怎麼會以warp為單位呢?
以及warp是為了隱藏從顯卡的記憶體抓資料所需的等待時間,可以轉換block執行
但這邊跟warp有甚麼關係呢? 這是跟block有關吧@@?
對於warp這邊看不太懂......
5. 如果我用cudaMencpy() 是等複製完成 才會往下執行對吧
很怕抓資料不完成
可是我如果想利用這段等待時間 利用CPU運算其他東西 該如何弄呢?
6. 看到書上有時候用CUDA_SAFT_CALL(cudaMemcpy) 或改成 c....(cudaMalloc(..))
這種CUDA_SAFT_CALL有加和沒加差哪呢 感覺好像都一樣
7. share memory時
extern __shared__ float shared[];
和 __shared__ float shared[];
差別?
書上是說有加extern 表將變數宣稱為外部陣列 這是啥意思?
另share memory 可以動態宣告嗎?? 我看都是靜態的
8. 假設我要openCV和CUDA結合使用
是寫在.cu 還是 .cpp呢?
假設我想要讀影像後傳到cuda運算
直接用cudaMencpy() 將 Image->data傳過去就好!?
9. 如何分析我到底要幾個grid block thread?
這邊不是很懂
目前是超過512就切block......
謝謝大大們了
書上真的看不太懂.......
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.18.104.235
※ 編輯: ofd168 來自: 163.18.104.235 (07/25 16:39)