2014-03-27 20 views
0

我嘗試將內存中的數據寫入文件。然後將其讀回並寫回到內存中。 目前我有以下代碼。但據我所知,它不能完全工作。內存中的數據是圖像。只要我沒有從文件中讀取它的罰款。但只要我讀到它被破壞了。將內存歸檔回內存

 size_t memsize = frameWidth * frameHeight;      //calculate the memory size 
    //Writing characters to file 
    char test; 

    char* data = (char*) malloc (memsize);       //create a datablock for the data on the heap 
    //* 

    cudaMemcpy(data, input, memsize,cudaMemcpyDeviceToHost);  //copy the data form the cuda to the CPU 
    FILE *fp; 
    fp = fopen (filename, "wb"); 
    int frames = memsize/sizeof(char); 
    for (int i = 0; i<(frames); i++) 
    { 
      test = data[i]; 
      fprintf(fp, "%c",test); 
    } 
    fclose (fp); 
    /**/ 
    free(data);              //clear the allocated memory 

////////////////////////////////////// 
//write back to the memory/////////// 
//////////////////////////////////// 
    data = (char*) malloc (memsize);       //create a datablock for the data on the heap 
    //* 

// FILE *fp; 
    fp = fopen (filename, "rb"); //read 


    for(int i=0; i<memsize; i++) 
     fscanf(fp, "%c ", (data+i)); 

    cudaMemcpy(input, data, memsize,cudaMemcpyHostToDevice);  //copy the data form the cuda to the CPU 
    log_kernel<<<grid, block>>>(input, pitchIn/sizeof(float), output, pitchOut/sizeof(float), frameHeight); 

    fclose (fp); 
    /**/ 
    free(data); 

                //clear the allocated memory 

但這並沒有完全奏效。我看到數據被破壞,但我不明白爲什麼有人會看到我犯的錯誤。

回答

2

嘗試使用

fread(data, sizeof(char), memsize, fp);

,而不是

for(int i=0; i<memsize; i++) fscanf(fp, "%c ", (data+i));

可能會解決你的問題,並會快很多。 此外,fscanf和fprintf被設計爲讀取/寫入格式化數據,而不是二進制字段。

2

假設數據實際上是二進制的而不是字符,其中一些可以很容易地具有值3210或其他一些。您正在使用"%c "來讀取文件,這意味着這些值(分別爲空格和換行的ASCII碼)將被愉快地跳過爲空格。

看到,因爲你已經標記這與C++,你可以簡單地做I/O的C++方式:

cudaMemcpy(data, input, memsize,cudaMemcpyDeviceToHost); 
{ 
    std::ofstream f(filename, std::ios::binary); 
    f.write(data, memsize); 
} 
free(data); 

// And 

{ 
    std::ifstream f(filename, std::ios::binary); 
    f.read(data, memsize); 
} 
cudaMemcpy(input, data, memsize,cudaMemcpyHostToDevice); 

當然,你也可以使用std::vector<char>代替char*,擺脫全部手動分配和釋放。然後,該代碼將簡化:

size_t memsize = frameWidth * frameHeight; 
std::vector<char> data(memsize); 
cudaMemcpy(&data[0], input, memsize,cudaMemcpyDeviceToHost); 
{ 
    std::ofstream f(filename, std::ios::binary); 
    f.write(&data[00, memsize); 
} 
data.clear(); 

// Now read back 

data.resize(memsize); 
{ 
    std::ifstream f(filename, std::ios::binary); 
    f.read(&data[0], memsize); 
} 
cudaMemcpy(input, data, memsize,cudaMemcpyHostToDevice); 

data.clear(); // optionally