如何解决不允许混合向量标量运算 C++
我必须对 main 方法的最内层循环进行矢量化:
int main(int argc,char *argv[]){
int w=1024,h=768,samps = argc==2 ? atoi(argv[1])/4 : 1; // # samples
Ray cam(Vec(50,52,295.6),Vec(0,-0.042612,-1).norm()); // cam pos,dir
Vec cx=Vec(w*.5135/h),cy=(cx%cam.d).norm()*.5135,r,*c=new Vec[w*h];
for (int y=0; y<h; y++){ // Loop over image rows
fprintf(stderr,"\rRendering (%d spp) %5.2f%%",samps*4,100.*y/(h-1));
for (unsigned short x=0,Xi[3]={0,y*y*y}; x<w; x++) // Loop cols
for (int sy=0,i=(h-y-1)*w+x; sy<2; sy++) // 2x2 subpixel rows
for (int sx=0; sx<2; sx++,r=Vec()){ // 2x2 subpixel cols
for (int s=0; s<samps; s++){
double r1=2*erand48(Xi),dx=r1<1 ? sqrt(r1)-1: 1-sqrt(2-r1);
double r2=2*erand48(Xi),dy=r2<1 ? sqrt(r2)-1: 1-sqrt(2-r2);
Vec d = cx*( ( (sx+.5 + dx)/2 + x)/w - .5) +
cy*( ( (sy+.5 + dy)/2 + y)/h - .5) + cam.d;
r = r + radiance(Ray(cam.o+d*140,d.norm()),Xi)*(1./samps);
} // Camera rays are pushed ^^^^^ forward to start in interior
c[i] = c[i] + Vec(clamp(r.x),clamp(r.y),clamp(r.z))*.25;
}
}
FILE *f = fopen("image.ppm","w"); // Write image to PPM file.
fprintf(f,"P3\n%d %d\n%d\n",w,h,255);
for (int i=0; i<w*h; i++)
fprintf(f,"%d %d %d ",toInt(c[i].x),toInt(c[i].y),toInt(c[i].z));
}
我尝试使用 #pragma omp simd,但是当我运行命令 -ftree-vectorize -fopt-info-vec 时,循环的矢量化没有成功,我尝试了内部函数。
int main(int argc,*c=new Vec[w*h];
for (int y=0; y<h; y++){ // Loop over image rows
fprintf(stderr,r=Vec()){ // 2x2 subpixel cols
__m128d r1,r2,dx,dy;
for (int s=0; s<samps; s++){
//double r1=2*erand48(Xi),dx=r1<1 ? sqrt(r1)-1: 1-sqrt(2-r1);
//double r2=2*erand48(Xi),dy=r2<1 ? sqrt(r2)-1: 1-sqrt(2-r2);
const __m128d r_index_mul = _mm_set1_pd(2.0);
const __m128d r1_index_mul = _mm_set1_pd(erand48(Xi));
const __m128d r2_index_mul = _mm_set1_pd(erand48(Xi));
const __m128d d_index_mul = _mm_set1_pd(1.0);
r1 = _mm_mul_pd(r_index_mul,r1_index_mul);
r2 = _mm_mul_pd(r_index_mul,r2_index_mul);
//expression must have bool type (or be convertible to bool)
if(r1<1){
dx = _mm_sub_pd(_mm_sqrt_pd(r1),d_index_mul);
}
else {
dx = _mm_sub_pd(d_index_mul,_mm_sqrt_pd(_mm_sub_pd(r_index_mul,r1)));
}
if(r2<1){
dx = _mm_sub_pd(_mm_sqrt_pd(r2),r2)));
}
Vec d = cx*( ( (sx+.5 + dx)/2 + x)/w - .5) +
cy*( ( (sy+.5 + dy)/2 + y)/h - .5) + cam.d;
r = r + radiance(Ray(cam.o+d*140,clamp(r.z))*.25;
}
}
在行 if(r1 中出现错误:不允许混合向量标量操作。同样的错误也发生在 Vec d = cx*( ( (sx+.5 + dx)/2 + x)/w - .5) + cy*( ( (sy+.5 + dy)/2 + y)/h - .5) + cam.d; 当我尝试与内在比较函数 _mm_cmplt_pd(r1,d_index_mul) 进行比较时,编译器说表达式必须具有 bool 类型(或可转换为 bool) 如何避免这些错误?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。