我想在cuda中启动多个内核函数,因此我声明了两个独立的网格集,块名称和每个集合的值是不同的。 e.g:
dim3 gridDim_1(val_1,1);
dim3 blockDim_1(val_2,val_3);
dim3 gridDim_2(val_4,1);
dim3 blockDim_2(val_5,val_6);
for(i=0;i<somenum;i++)
{
kernel_1<<<gridDim_1,blockDim_1>>>(agr1,arg2);
kernel_2<<<gridDim_2,blockDim_2>>>(agr3,arg4);
}
但编译器抛出错误说错误:gridDim_1是未知的,类似于其他块和网格声明。那我怎么能用不同的网格和块名称启动这两个内核呢?我需要在这里提一下,网格中的块数和块中的线程数取决于用户输入。谢谢你的帮助。
实际上主要代码真的很大,我也时不时地改变以摆脱错误。我发布了它的一部分只在我认为问题存在的地方:
int k,sim_step;
int counter_top,counter_bottom;
............
...................
for(k=0;k<=sim_step;k++)
{
dim3 gridDim(1,1);
dim3 blockDim(counter_top,1,1);
agent_movement_top<<<gridDim,blockDim>>>(args..) ;
dim3 gridDim(1,1);
dim3 blockDim(counter_bottom,1,1);
agent_movement_bot<<<gridDim,blockDim>>>(args...);
}
我得到的当前错误是: 错误LNK2001:未解析的外部符号_gridDim 错误LNK2001:未解析的外部符号_blockDim
答案 0 :(得分:3)
您要两次定义相同的变量。你可以,例如只需通过附加块({
... }
对)限制每个定义的范围即可消除该错误:
int k,sim_step;
int counter_top,counter_bottom;
............
...................
for(k=0;k<=sim_step;k++)
{
{
dim3 gridDim(1,1);
dim3 blockDim(counter_top,1,1);
agent_movement_top<<<gridDim,blockDim>>>(args..) ;
}
{
dim3 gridDim(1,1);
dim3 blockDim(counter_bottom,1,1);
agent_movement_bot<<<gridDim,blockDim>>>(args...);
}
}