如何在设备中声明其成员的结构,是一个数组,然后为此动态分配内存。例如,在下面的代码中,编译器说: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) ));
答案 0 :(得分:4)
从设备代码开始,支持动态内存分配(malloc
和new
)only with devices of cc2.0 and greater。如果您有cc2.0或更高版本的设备,并且您将适当的标志传递给nvcc(例如-arch=sm_20
),则不应该看到此错误。请注意,如果要传递多个编译目标(sm_10,sm_20等),即使其中一个目标不符合cc2.0 +要求,您也会看到此错误。
如果您有cc1.x设备,则需要从主机执行这些类型的分配(例如,使用cudaMalloc
)并将适当的指针传递给您的内核。
如果您选择该路线(从主机分配),您可能也会对我对此问题的回答感兴趣one。
编辑:回答以下问题:
GPU Architecture (1)
(和(2)
等条目。)这些是您可以单击的下拉列表,并选择要为其编译的目标。如果您的GPU是sm_21,我会为(1)
选择它并将其他空白留空,或选择兼容的版本,如sm_20。