0

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

dev_size_idx_threadsis的类型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) ));
4

1 回答 1

4

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

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

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

编辑:回答以下问题:

  1. 在visual studio(2008 express,其他版本应该类似),可以设置编译目标如下:打开项目,选择Project...Properties,选择Configuration Properties...CUDA Runtime API...GPU 现在,在在右侧窗格中,您将看到类似GPU Architecture (1)(2)等)的条目。这些是您可以单击并选择要编译的目标的下拉列表。如果您的 GPU 是 sm_21,我会选择它(1)并将其他留空,或者选择兼容版本,例如 sm_20。
  2. 要查看工作示例,请点击我上面给出的链接。我在此处的回答中链接了几个工作示例以及如何完成的描述。
于 2013-05-29T16:11:07.293 回答