簡體   English   中英

如何將stl向量的矩陣轉換為2d數組(或1d數組)的矩陣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM