我对 MATLAB 或 CUDA 一无所知,但您的问题出在 C++ 中。像这样声明的数组必须在编译时具有固定的大小。
解决方案 1:固定大小
声明你的变量 M const
。这些是等价的:
int const M = 10;
const int M = 10;
然后编译器就会知道,无论您如何运行程序,它都可以假设这些变量始终具有相同的值。
解决方案 2:C 风格的动态分配
new
使用和进行动态分配delete
。在称为“free-store”的内存抽象部分(而不是像您拥有的那些数组那样在“堆栈”上)分配的数组可以动态确定它们的大小。你像这样使用它:
float * V = new V[M]; //V is a pointer to some freestore memory
//You use it and pass it like you would a normal array:
V[2] = 5.5;
int x = some_func(V);
//But after you're done, you should manually free the memory
delete [] V; //don't forget the [], since you used [] in the allocation
我不建议这样做,因为可能会忘记删除内存。
解决方案 3:使用 C++ 的自动内存管理vector
在 C++ 中,内存管理的工作可以隐藏在称为类的结构后面。
#include<vector>
using std::vector;
vector<float> V(M); //V is a vector of floats, with initial size M
//You use it like a normal array
V[2] = 5.5;
//But to pass it as an array, you need to pass a pointer to the first element
int x = some_func(&V[0]); //read as &(V[0]): pass in the address of V[0]
解决方案 3b:CUDA 兼容向量
Thrust 是基于标准模板库 (STL) 的 CUDA 的 C++ 模板库。Thrust 允许您通过与 CUDA C 完全互操作的高级接口以最少的编程工作量实现高性能并行应用程序。
http://docs.nvidia.com/cuda/thrust/#vectors
结论
如果您使用的是固定尺寸,我推荐解决方案 1。如果您使用的是在运行时确定的尺寸,我推荐使用矢量。
(顺便说一句,当您将普通数组传递给函数时,您实际上传递的是指向第一个元素的指针,而不是数组。数组的名称会自动转换为指针类型。)