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



如何在设备中声明其成员为数组的结构体,然后为其动态分配内存。例如在下面的代码中,编译器说: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) ));

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

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

如果你选择了那条路由(从主机分配),你可能也会对我对这类问题的回答感兴趣。

编辑:回答以下问题:

  1. 在visual studio (2008 express,应该与其他版本类似)中,您可以设置编译目标如下:打开项目,选择项目…Properties,选择Configuration Properties…CUDA运行时API…现在,在右侧窗格中,您将看到GPU Architecture (1)(和(2)等)等条目,这些是下拉菜单,您可以单击并选择您想要编译的目标。如果你的GPU是sm_21,我会选择(1),并留下其他空白,或选择兼容版本,如sm_20。
  2. 要查看工作示例,请点击我上面给出的链接。从我的回答中链接了几个工作示例,以及如何完成的描述。

相关内容

  • 没有找到相关文章

最新更新