不允许混合向量标量运算 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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...