2015-06-24 51 views
0

我想盡可能少複製。目前我正在使用num_t* array = new num_t[..],然後將多維向量的每個值複製到for循環中的array將多維std :: vector轉換爲一個數組的最快方式

我想找一個更好的方法來做到這一點。

+2

如果它是你的關鍵,那麼也許你應該考慮不使用'VECTOR'開始。 –

+0

@aces是否是num_t算術類型? –

+0

無論如何,你應該使用一個庫的副本而不是你自己的循環。在C++中,這是''的'copy'。 –

回答

0

對於算術類型,您可以使用函數memcpy。例如

#include <iostream> 
#include <vector> 
#include <cstring> 

int main() 
{ 
    std::vector<std::vector<int>> v = 
    { 
     { 1 }, 
     { 1, 2 }, 
     { 1, 2, 3 }, 
     { 1, 2, 3, 4 } 
    }; 

    for (const auto &row : v) 
    { 
     for (int x : row) std::cout << x << ' '; 
     std::cout << std::endl; 
    } 
    std::cout << std::endl; 

    size_t n = 0; 
    for (const auto &row : v) n += row.size(); 

    int *a = new int[n]; 
    int *p = a; 

    for (const auto &row : v) 
    { 
     std::memcpy(p, row.data(), row.size() * sizeof(int)); 
     p += row.size(); 
    }   

    for (p = a; p != a + n; ++p) std::cout << *p << ' '; 
    std::cout << std::endl; 

    delete []a; 
}  

程序輸出是

1 
1 2 
1 2 3 
1 2 3 4 

1 1 2 1 2 3 1 2 3 4 
+0

謝謝。我相信std :: copy比memcpy更快?沒有? – aces

+0

@aces我認爲它不是更快。初始化算術類型數組時,至少編譯器使用memcpy。 –

+0

@aces在某些平臺上,例如IBM大型機函數memcpy被一個機器命令替代,如MVCL –

0

,正如你在vector<vector<T>>結構,你的內心矢量大小相同的意見陳述。所以你實際上試圖做的是存儲m x n矩陣。

通常這樣的矩陣是而不是存儲在多維結構中但存儲在線性存儲器中。然後基於最經常使用的索引方案導出給定元素的位置(行,列)。

由於您已經聲明您將此數據複製到GPU上,因此只需複製線性矢量作爲整體即可完成此複製。 然後,您將在GPU和主機上使用相同的索引方案。

如果您使用的是CUDA,請查看Thrust。它提供thrust::host_vector<T>thrust::device_vector<T>,甚至進一步簡化複製:

thrust::host_vector<int> hostVec(100); // 10 x 10 matrix 
thrust::device_vector<int> deviceVec = hostVec; // copies hostVec to GPU 
相關問題