[英]How to convert a matrix of stl vectors to matrix of 2d arrays (or to 1d array)
我正在使用CUDA,但似乎無法將STL矢量作為參數傳遞,因此我需要將矢量矩陣轉換為動態數組。
std::vector< std::vector<float> > some_matrix;
float **f;
我嘗試使用memcpy函數,但由於某些原因它無法按預期工作,如果我嘗試復制內容,則原始矩陣中的某些值將更改為垃圾。 我避免使用周期,因為那樣會降低效率。
如您所知,不可能將std::vector
傳遞給CUDA內核並在內核代碼中使用它,並且不可能傳遞可能從std::vector< std::vector<float> >
構造的簡單主機指針數組std::vector< std::vector<float> >
可以轉換為CUDA內核。
您需要做的是首先創建一個設備指針的主機數組(因此,復制到設備的每一行都有一個條目),然后將該指針數組復制到設備。 這意味着,復制到設備上的每個矩陣行或列都需要cudaMalloc和cudaMemcpy調用。 您可以這樣做:
std::vector< std::vector<float> > some_matrix;
float** f = new float*[some_matrix.size()];
for (int i = 0; i < some_matrix.size(); ++i) {
size_t szp = sizeof(float) * some_matrix[i].size();
float* p;
cudaMalloc((void **)&p, sz);
cudaMemcpy(p, &some_matrix[i][0], szp, cudaMemcpyHostToDevice);
f[i] = p;
}
float** f_dev;
size_t szf = sizeof(float*) * some_matrix.size();
cudaMalloc((void **)&f_dev, szf);
cudaMemcpy(f_dev, f, szf, cudaMemcpyHostToDevice);
[免責聲明:用瀏覽器編寫,未經編譯或測試,使用后果自負]
之后,可以將f_dev
安全地傳遞到CUDA內核並在設備上使用。
希望您可以從上面的代碼中看到為什么這種數據結構在GPU上不那么容易使用。 設置和傳輸它會產生大量API開銷,然后在設備上會產生延遲損失,因為需要雙指針間接將數據取到內存。
對於源數據不是“鋸齒狀數組”(即矩陣中的所有行都具有相同長度)的情況,存儲在線性存儲器中的扁平列主數組或行主數組是更好的解決方案。 如果源陣列呈鋸齒狀,請考慮使用類似於CSR或CSC稀疏矩陣格式的結構。 這些沒有在設備上提供很多性能改進,但是它們確實減少了管理它們的主機側API開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.