-1

我最近发现这在我计划编译并稍后在 Matlab 中调用的全局 CUDA C++ 代码中不起作用:

诠释 M = 10; 浮动V[M];或者如果我要从 matlab 主机代码中导入 M 值。

但这有效: float V[10];

有人告诉我有一个叫做 new 的函数可以用来避免这个问题,但是我在网上阅读并且仍然很困惑如何使用这个新函数,而且它似乎只适用于主机代码,对吗?如果是这样,那么它不适用于我的情况,因为我的主机代码在 matlab 中。这是解决这个问题的一种方法,这样我就不必一个一个地改变向量长度?谢谢!

4

1 回答 1

1

我对 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。如果您使用的是在运行时确定的尺寸,我推荐使用矢量。

(顺便说一句,当您将普通数组传递给函数时,您实际上传递的是指向第一个元素的指针,而不是数组。数组的名称会自动转换为指针类型。)

于 2013-11-10T04:09:21.573 回答