【问题标题】:fastest way converting multidimensional std::vector into one array将多维 std::vector 转换为一个数组的最快方法
【发布时间】:2015-06-24 08:06:28
【问题描述】:

我想尽可能少地复制。目前我正在使用num_t* array = new num_t[..],然后在for循环中将多维向量的每个值复制到array

我想找到一个更好的方法来做到这一点。

【问题讨论】:

  • 如果它对您来说很重要,那么也许您应该考虑不使用 vector 开始。
  • @aces 是 num_t 算术类型吗?
  • 无论如何,您应该使用库的副本而不是您自己的循环。在 C++ 中,这是 <algorithm>s copy
  • 顺便说一句,您可以使用 vector 函数 data()size() 在单个函数调用中复制整个数据。
  • 那么我将使用 vector> 而是存储二维数据,例如在row-major order 中,在平面向量 中。复制这个向量就很容易了。

标签: c++ arrays multidimensional-array stl stdvector


【解决方案1】:

对于算术类型,您可以使用函数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 我认为它并不快。至少编译器在初始化算术类型的数组时使用 memcpy。
  • @aces 在某些平台中,例如 IBM 大型机功能 memcpy 被替换为像 MVCL 这样的机器命令
  • 你为什么要明确提到算术类型? memcpy 复制类和结构不好吗?
  • @Maarten Bamelis 如果容器包含 POD 类型,那么它是安全的。
【解决方案2】:

正如您在 cmets 中所述,您的 vector&lt;vector&lt;T&gt;&gt; 结构的内部向量具有相同的大小。所以你实际上想要做的是存储一个m x n 矩阵。

通常,此类矩阵存储在多维结构中,而是存储在线性内存中。然后根据最常使用row-major and column-major order 的索引方案得出给定元素的位置(行、列)。

由于您已经声明要将这些数据复制到 GPU 上,因此只需将线性向量作为一个整体进行复制即可完成复制。 然后,您将在 GPU 和主机上使用相同的索引方案。

如果您使用的是 CUDA,请查看Thrust。它提供thrust::host_vector&lt;T&gt;thrust::device_vector&lt;T&gt; 并进一步简化了复制:

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

【讨论】:

    猜你喜欢
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2011-07-05
    • 2021-12-20
    • 2011-04-06
    相关资源
    最近更新 更多