2012-02-11 2 views
2

Нужна помощь. У меня возникла проблема при запуске кода на C++ в Windows-Visual Studio.Как увеличить ограничение памяти в Visual Studio C++

Когда я запускаю этот код в среде Linux, нет ограничений на память, которую я могу выделить динамически (до размера, доступного в ОЗУ).

Но на компиляторе VS он не позволяет мне создавать массив за ограниченным размером. Я попробовал/F вариант и 20-25 ссылок Google для увеличения объема памяти, но они, похоже, мало помогают.

В настоящее время я могу назначить только около 100mb из 3gb.

Если в Windows есть решение, а не в компиляторе Visual Studio, я буду рад услышать, что, поскольку у меня есть карта CUDA TeslaC2070, которая оказалась довольно бесполезной для Windows, поскольку я хотел запустить свой CUDA/C++ в среде Windows.

Вот мой код. он терпит неудачу, когда LENGTH> 128 (нет изображений размером 640x480 пикселей меньше, чем 0.5 мб). Я также вычислил приблизительный объем памяти, который он принимает, подсчитывая структуры данных и типы, используемые в OpenCV, и мной, но все же это очень меньше, чем 2gb) , исключение stackoverflow. То же самое с динамическим распределением. Я уже увеличил размеры кучи и стека.

#include "stdafx.h" 

#include <cv.h> 
#include <cxcore.h> 
#include <highgui.h> 

#include <cuda.h> 
#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 
#define LENGTH 100 
#define SIZE1 640 
#define SIZE2 480 
#include <iostream> 
using namespace std; 


__global__ void square_array(double *img1_d, long N) 
{ 

int idx = blockIdx.x * blockDim.x + threadIdx.x; 

img1_d[idx]= 255.0-img1_d[idx]; 

} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
     IplImage *img1[LENGTH]; 
     // Open the file. 
     for(int i=0;i<LENGTH;i++) 
     { img1[i] = cvLoadImage("abstract3.jpg");} 




    CvMat *mat1[LENGTH]; 
    for(int i=0;i<LENGTH;i++) 
    { 
     mat1[i] = cvCreateMat(img1[i]->height,img1[i]->width,CV_32FC3); 
     cvConvert(img1[i], mat1[i]); 
    } 


    double a[LENGTH][2*SIZE1][SIZE2][3]; 

    for(int m=0;m<LENGTH;m++) 
    { 
    for(int i=0;i<SIZE1;i++) 
    { 
     for(int j=0;j<SIZE2;j++) 
     { 
       CvScalar scal = cvGet2D(mat1[m],j,i); 
       a[m][i][j][0] = scal.val[0]; 
       a[m][i][j][1] = scal.val[1]; 
       a[m][i][j][2] = scal.val[2]; 

       a[m][i+SIZE1][j][0] = scal.val[0]; 
       a[m][i+SIZE1][j][1] = scal.val[1]; 
       a[m][i+SIZE1][j][2] = scal.val[2]; 

      } 

    } } 

//cuda 
double *a_d; 
int N=LENGTH*2*SIZE1*SIZE2*3; 

cudaMalloc((void **) &a_d, N*sizeof(double)); 
cudaMemcpy(a_d, a, N*sizeof(double), cudaMemcpyHostToDevice); 
int block_size = 370; 
int n_blocks = N/block_size + (N%block_size == 0 ? 0:1); 
cout<<n_blocks<<block_size; 
square_array <<< n_blocks, block_size >>> (a_d, N); 
cudaMemcpy(a, a_d, N*sizeof(double), cudaMemcpyDeviceToHost); 

//cuda end 



char name[]= "Image: 00000"; 
name[12]='\0'; 
int x=0,y=0; 
for(int m=0;m<LENGTH;m++) 
{ 
for (int i = 0; i < img1[m]->width*img1[m]->height*3; i+=3) 
{ 
img1[m]->imageData[i]= a[m][x][y][0]; 
img1[m]->imageData[i+1]= a[m][x][y][1]; 
img1[m]->imageData[i+2]= a[m][x][y][2]; 

    if(x==SIZE1) 
    { 
    x=0; 
    y++; 
    } 
x++; 
} 

    switch(name[11]) 
    { 
     case '9': switch(name[10]) 
     { 
      case '9': 
      switch(name[9]) 
      { 
       case '9': name[11]='0';name[10]='0';name[9]='0';name[8]++; 
       break; 
       default : name[11]='0'; 
       name[10]='0'; 
       name[9]++; 
      }break; 

      default : name[11]='0'; name[10]++;break; 
      } 

      break; 
     default : name[11]++;break; 
    } 
     // Display the image. 
     cvNamedWindow(name, CV_WINDOW_AUTOSIZE); 
     cvShowImage(name,img1); 
    //cvSaveImage(name ,img1); 
} 
     // Wait for the user to press a key in the GUI window. 
     cvWaitKey(0); 

     // Free the resources. 
     //cvDestroyWindow(x); 
     //cvReleaseImage(&img1); 
    //cvDestroyWindow("Image:"); 
     //cvReleaseImage(&img2); 

     return 0; 
} 
+1

Просьба указать пример кода. Вы даже не сказали нам, что такое предел. –

+0

@JohnSaunders Я загрузил код. Не могли бы вы помочь мне в этом. Мне действительно нужно решить эту проблему, поскольку я застрял на ней последние 6 месяцев. Код работает нормально в течение 2-3 дней в Linux. Я также могу загрузить скриншоты настроек VS, если они вам понадобятся. Заранее спасибо за помощь. – daerty0153

+0

Мой C++ слишком ржавый, чтобы много помочь. На каких линиях возникают проблемы? –

ответ

2

Проблема заключается в том, что вы выделить огромный многомерный массив в стеке в вашей основной функции (двойной а [..] [..] [..]). Не выделяйте столько памяти в стеке. Используйте malloc/new для размещения в куче.

+0

OpenCV имеет свои собственные реализации стека, на которые у меня нет никакого контроля. Пожалуйста помоги. спасибо – daerty0153

+1

Я говорю вам, что это массив, который вы объявляете самим собой, что является проблемой. – rasmus

+0

Хорошо. Я полностью понимаю, что вы имеете в виду, но я не могу размещать здесь каждый код, так как я не совсем уверен, как работает этот сайт. Я застрял в этой проблеме за последние 6 месяцев и попробовал очень простой код opencv, в который я ввел 300 изображений и сохранил их. и этот код также не работает. Я согласен, что в этом коде double играет роль в стеке, но также из opencv. – daerty0153

Смежные вопросы