我想为大量的数据(如:ints)创建一个数组,这个数组将表示2D矩阵。我不能使用STL,因为它将与CUDA一起运行。我想知道以下选项的利弊。
我正在考虑第二个选项。我的电脑上的Sizeof(int)是32位的。我认为对于某些测试案例来说,它可能太小了(如果我使用大于32k x 32k的矩阵)。
第三个选项似乎是最灵活的,但我听说这不是好的做法。
有没有其他的选择来创建这样的数组(> 1B元素)?有没有可能创建长度大于INT_MAX2的一维数组?
如何在现代C++中创建一个巨大的数组?
使用动态分配1. 在标准的、托管的C++中,通常会使用 std::vector
.
我不能使用STL,因为它将与CUDA一起运行。
你是指标准库吗?在这种情况下,解决方案是使用另一个可以与CUDA一起运行的容器。
int* arr = new int[SIZE]
你确定使用 new[]
容器的使用受到限制的原因不一样吗?我希望 new[]
不能成为一个选项,如果容器不是。不清楚你的限制到底是什么。
无论如何,你不应该使用裸露的自有指针。使用一个容器或者至少是一个智能指针。
int** arr = new int*[DIM1]
如果你需要有不同长度的行或需要交换行,这可能是有用的(忽略使用裸露指针的所有权,这是不好的)。否则这与一维数组相比没有任何优势。
是否可以创建长度大于INT_MAX2的一维数组?
假设是32位 int
, INT_MAX/2
将是一GB。这在64位系统上是没有问题的,只要你有足够的内存。在32位系统上,也许只是勉强,但你可能没有足够的内存。
但我通常用cudaMallocManaged创建int*,然后从文件中填充。所以std::vector在这里没有帮助,因为我甚至不需要使用它。
如果您使用 cudaMallocManaged
那么你就不会使用 new[]
所以在这里也帮不上忙。
1 除非数组需要非常巨大,以至于不能整体保存在内存中,在这种情况下,就必须在文件系统中以文件的形式创建。