如何在设备中声明一个带有动态数组的结构

时间:2013-05-29 16:04:14

标签: cuda

如何在设备中声明其成员的结构,是一个数组,然后为此动态分配内存。例如,在下面的代码中,编译器说:error : calling a __host__ function("malloc") from a __global__ function("kernel_ScoreMatrix") is not allowed。还有其他方法可以执行此操作吗?

dev_size_idx_threads的类型为int*及其值,发送到内核并用于分配内存。

struct struct_matrix
{
    int *idx_threads_x;
    int *idx_threads_y;
    int thread_diag_length;
    int idx_length;
};

struct  struct_matrix matrix[BLOCK_SIZE_Y];

matrix->idx_threads_x= (int *) malloc ((*(dev_size_idx_threads) * sizeof(int) ));

1 个答案:

答案 0 :(得分:4)

从设备代码开始,支持动态内存分配(mallocnewonly with devices of cc2.0 and greater。如果您有cc2.0或更高版本的设备,并且您将适当的标志传递给nvcc(例如-arch=sm_20),则不应该看到此错误。请注意,如果要传递多个编译目标(sm_10,sm_20等),即使其中一个目标不符合cc2.0 +要求,您也会看到此错误。

如果您有cc1.x设备,则需要从主机执行这些类型的分配(例如,使用cudaMalloc)并将适当的指针传递给您的内核。

如果您选择该路线(从主机分配),您可能也会对我对此问题的回答感兴趣one

编辑:回答以下问题:

  1. 在visual studio(2008 express,应该与其他版本类似),您可以设置编译目标如下:打开项目,选择Project ... Properties,选择Configuration Properties ... CUDA Runtime API ... GPU现在,在右侧窗格中,您将看到GPU Architecture (1)(和(2)等条目。)这些是您可以单击的下拉列表,并选择要为其编译的目标。如果您的GPU是sm_21,我会为(1)选择它并将其他空白留空,或选择兼容的版本,如sm_20。
  2. 要查看有用的示例,请按照我上面给出的链接。我的回答here以及对其完成方式的描述都链接了几个有用的例子。