cuda优化一个3重for循环问题

夜田插猹 2017-10-15 04:04:38

lz刚接触cuda不久,lz在利用遗传算法解决某问题时,对于多层for循环嵌套问题处理存在一些困惑,下面贴出lz想对此3层for循环进行优化的部分。请各位大神给出一些建议!需要注意的是,似乎内层变量都需要外层变量作为参数。不知像此类循环,能否写成以每个pop_i作为一个grid,每个K_i作为一个block,每个N_i作为一个thread。但lz发现这样是行不通的,不知问题究竟出在哪里。
for (int pop_i=0;pop_i<Popsize;pop_i++)
{
cosfx[pop_i]=0;
for (int K_i=0;K_i<L*K;K_i++)
{

dis_temp_x_sear[K_i]=chrom_orig_x[pop_i]-base_x[K_i];
dis_temp_y_sear[K_i]=chrom_orig_y[pop_i]-base_y[K_i];

dis_norm_sear[K_i]=sqrt(pow((dis_temp_x_sear[K_i]),2)+pow((dis_temp_y_sear[K_i]),2));//y=pow(x,2);x^2
sin_theta_sear[K_i]=dis_temp_x_sear[K_i]/dis_norm_sear[K_i];
dop_sear[K_i]=fc/c*(v_x[K_i]*(dis_temp_x_sear[K_i])+v_y[K_i]*(dis_temp_y_sear[K_i]))/dis_norm_sear[K_i];

alk_sear_1[2*K_i+0]=cos(2*Pi*dw*sin_theta_sear[K_i]*0);
alk_sear_1[2*K_i+1]=sin(2*Pi*dw*sin_theta_sear[K_i]*0);
alk_sear_2[2*K_i+0]=cos(2*Pi*dw*sin_theta_sear[K_i]*1);
alk_sear_2[2*K_i+1]=sin(2*Pi*dw*sin_theta_sear[K_i]*1);
alk_sear_3[2*K_i+0]=cos(2*Pi*dw*sin_theta_sear[K_i]*2);
alk_sear_3[2*K_i+1]=sin(2*Pi*dw*sin_theta_sear[K_i]*2);


E[2*K_i+0]=0;
E[2*K_i+1]=0;

for (int N_i=0;N_i<N;N_i++)
{

dop_temp_sear0[K_i]=cos(-2*Pi*Tn[N_i]*dop_sear[K_i]);
dop_temp_sear1[K_i]=sin(-2*Pi*Tn[N_i]*dop_sear[K_i]);

E[2*K_i+0]+=(
(dop_temp_sear0[K_i]*(alk_sear_1[2*K_i+0]*rl_temp_1[2*N*K_i+2*N_i+0]-alk_sear_1[2*K_i+1]*rl_temp_1[2*N*K_i+2*N_i+1])
-dop_temp_sear1[K_i]*(alk_sear_1[2*K_i+0]*rl_temp_1[2*N*K_i+2*N_i+1]+alk_sear_1[2*K_i+1]*rl_temp_1[2*N*K_i+2*N_i+0]))

+(dop_temp_sear0[K_i]*(alk_sear_2[2*K_i+0]*rl_temp_2[2*N*K_i+2*N_i+0]-alk_sear_2[2*K_i+1]*rl_temp_2[2*N*K_i+2*N_i+1])
-dop_temp_sear1[K_i]*(alk_sear_2[2*K_i+0]*rl_temp_2[2*N*K_i+2*N_i+1]+alk_sear_2[2*K_i+1]*rl_temp_2[2*N*K_i+2*N_i+0]))

+(dop_temp_sear0[K_i]*(alk_sear_3[2*K_i+0]*rl_temp_3[2*N*K_i+2*N_i+0]-alk_sear_3[2*K_i+1]*rl_temp_3[2*N*K_i+2*N_i+1])
-dop_temp_sear1[K_i]*(alk_sear_3[2*K_i+0]*rl_temp_3[2*N*K_i+2*N_i+1]+alk_sear_3[2*K_i+1]*rl_temp_3[2*N*K_i+2*N_i+0]))
);



E[2*K_i+1]+=(
(dop_temp_sear0[K_i]*(alk_sear_1[2*K_i+0]*rl_temp_1[2*N*K_i+2*N_i+1]+alk_sear_1[2*K_i+1]*rl_temp_1[2*N*K_i+2*N_i+0])
+dop_temp_sear1[K_i]*(alk_sear_1[2*K_i+0]*rl_temp_1[2*N*K_i+2*N_i+0]-alk_sear_1[2*K_i+1]*rl_temp_1[2*N*K_i+2*N_i+1]))

+(dop_temp_sear0[K_i]*(alk_sear_2[2*K_i+0]*rl_temp_2[2*N*K_i+2*N_i+1]+alk_sear_2[2*K_i+1]*rl_temp_2[2*N*K_i+2*N_i+0])
+dop_temp_sear1[K_i]*(alk_sear_2[2*K_i+0]*rl_temp_2[2*N*K_i+2*N_i+0]-alk_sear_2[2*K_i+1]*rl_temp_2[2*N*K_i+2*N_i+1]))

+(dop_temp_sear0[K_i]*(alk_sear_3[2*K_i+0]*rl_temp_3[2*N*K_i+2*N_i+1]+alk_sear_3[2*K_i+1]*rl_temp_3[2*N*K_i+2*N_i+0])
+dop_temp_sear1[K_i]*(alk_sear_3[2*K_i+0]*rl_temp_3[2*N*K_i+2*N_i+0]-alk_sear_3[2*K_i+1]*rl_temp_3[2*N*K_i+2*N_i+1]))
);

}
E_H[2*K_i+0]=E[2*K_i+0];
E_H[2*K_i+1]=-E[2*K_i+1];

cosfx[pop_i]+=((E[2*K_i+0]*E[2*K_i+0])+(E[2*K_i+1]*E[2*K_i+1]));

}

}
...全文
1597 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

580

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧