如何在设备中声明其成员为数组的结构体,然后为其动态分配内存。例如在下面的代码中,编译器说: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及以上版本的设备才支持动态内存分配(malloc
和new
)。如果您有cc2.0或更高版本的设备,并且将适当的标志传递给nvcc(例如-arch=sm_20
),则不应该看到此错误。请注意,如果传递多个编译目标(sm_10、sm_20等),即使其中一个目标不满足cc2.0+要求,也会看到此错误。
如果您有cc1。你需要在主机上执行这些类型的分配(例如使用cudaMalloc
),并将适当的指针传递给内核。
如果你选择了那条路由(从主机分配),你可能也会对我对这类问题的回答感兴趣。
编辑:回答以下问题:
- 在visual studio (2008 express,应该与其他版本类似)中,您可以设置编译目标如下:打开项目,选择项目…Properties,选择Configuration Properties…CUDA运行时API…现在,在右侧窗格中,您将看到
GPU Architecture (1)
(和(2)
等)等条目,这些是下拉菜单,您可以单击并选择您想要编译的目标。如果你的GPU是sm_21,我会选择(1)
,并留下其他空白,或选择兼容版本,如sm_20。 - 要查看工作示例,请点击我上面给出的链接。从我的回答中链接了几个工作示例,以及如何完成的描述。