我想盡可能少複製。目前我正在使用num_t* array = new num_t[..]
,然後將多維向量的每個值複製到for循環中的array
。將多維std :: vector轉換爲一個數組的最快方式
我想找一個更好的方法來做到這一點。
我想盡可能少複製。目前我正在使用num_t* array = new num_t[..]
,然後將多維向量的每個值複製到for循環中的array
。將多維std :: vector轉換爲一個數組的最快方式
我想找一個更好的方法來做到這一點。
對於算術類型,您可以使用函數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
謝謝。我相信std :: copy比memcpy更快?沒有? – aces
@aces我認爲它不是更快。初始化算術類型數組時,至少編譯器使用memcpy。 –
@aces在某些平臺上,例如IBM大型機函數memcpy被一個機器命令替代,如MVCL –
,正如你在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
如果它是你的關鍵,那麼也許你應該考慮不使用'VECTOR'開始。 –
@aces是否是num_t算術類型? –
無論如何,你應該使用一個庫的副本而不是你自己的循環。在C++中,這是''的'copy'。 –