我尝试将数据从内存写入文件。把它读回来,然后写回记忆里。目前,我有下面的代码。但据我所知,它并没有完全发挥作用。内存中的数据是图像。只要我不从文件里读出来就行了。但我一读到它就被腐蚀了。
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但这并不能完全奏效。我看到数据被破坏了,但我看不出为什么有人会看到我犯的错误。
发布于 2014-03-27 13:18:36
试着使用
fread(data, sizeof(char), memsize, fp);
而不是
for(int i=0; i<memsize; i++) fscanf(fp, "%c ", (data+i));
可能会解决你的问题,而且会更快。此外,fscanf和fprintf设计用于读取/写入格式化数据,而不是二进制字段。
发布于 2014-03-27 13:17:59
假设数据实际上是二进制的,而不是字符,那么其中一些可以很容易地具有值32或10或其他类似的值。您正在使用"%c "读取文件,这意味着这些值(分别为空格和linefeed的ASCII代码)将很高兴地被跳过为空白。
考虑到您已经用C++标记了这一点,您可以简单地以C++的方式执行I/O:
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(); // optionallyhttps://stackoverflow.com/questions/22688809
复制相似问题