如何在堆栈上分配大数组?

时间:2017-04-12 00:16:15

标签: c++ c stack malloc vectorization

我已将this中的代码实现为矢量化:

   int c=0;
   for (int j=-halfHeight; j<=halfHeight; ++j)
   {
       #pragma omp simd
       for(int i=-halfWidth; i<=halfWidth; ++i){
           wx_[c] = ofsx + j * a12 + i * a11;
           wy_[c] = ofsy + j * a22 + i * a21;
           x_[c] = (int) floor(wx_[c]);
           y_[c] = (int) floor(wy_[c]);
           ++c;
       }
   }

   std::cout<<"First size="<<size<<std::endl;

   float imat_1[size];
   std::cout<<"imat1"<<std::endl;
   float imat_2[size];
   std::cout<<"imat2"<<std::endl;
   float imat_3[size];
   std::cout<<"imat3"<<std::endl;
   float imat_4[size];`
   std::cout<<"imat4"<<std::endl;

   #pragma omp simd
   for(int c=0; c<size; c++){
       if (x_[c] >= 0 && y_[c] >= 0 && x_[c] < width && y_[c] < height){
           wx_[c] -= x_[c];
           wy_[c] -= y_[c];
           imat_1[c] = im.at<float>(y_[c],x_[c]);
           imat_2[c] = im.at<float>(y_[c],x_[c]+1);
           imat_3[c] = im.at<float>(y_[c]+1,x_[c]);
           imat_4[c] = im.at<float>(y_[c]+1,x_[c]+1);
       }
       else{
           wx_[c] = 0;
           wy_[c] = 0;
           imat_1[c] = 0;
           imat_2[c] = 0;
           imat_3[c] = 0;
           imat_4[c] = 0;
           ret = true;
       }
   }

   std::cout<<"Second"<<std::endl;

   #pragma omp simd
   for(int c=0; c<size; c++){
       out[c] =
               (1.0f - wy_[c]) * ((1.0f - wx_[c]) * imat_1[c]   + wx_[c] * imat_2[c]) +
               (       wy_[c]) * ((1.0f - wx_[c]) * imat_3[c] + wx_[c] * imat_4[c]);
   }

特别是,size最高可达275625。当我运行此代码时,它会在行float imat_4[size];处进入分段错误。实际上,这可以通过使用float *imat_4 = (float*)malloc(sizeof(float)*size);

来解决

我认为这是因为this,所以我们在堆栈上耗尽内存......但是,我怎么能解决这个问题呢?我没有看到对这个代码进行矢量化的其他可能性。

注意性能在这里至关重要,因此在堆栈上分配效率较低(对吗?)

0 个答案:

没有答案