我尝试将内存中的数据写入文件。然后读回来并将其写回内存。 目前我有以下代码。但据我所知,它并没有完全发挥作用。存储器中的数据是图像。只要我不从文件中读取它就好了。但是一旦我读到它就会被破坏。
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
但这并不完全有效。我看到数据被破坏但我不明白为什么 谁能看到我犯的错误。
答案 0 :(得分:2)
假设数据实际上是二进制而不是字符,其中一些数据很容易具有值32
或10
或其他类似值。您正在使用"%c "
读取文件,这意味着这些值(空格和换行的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(); // optionally
答案 1 :(得分:2)
尝试使用
fread(data, sizeof(char), memsize, fp);
而不是
for(int i=0; i<memsize; i++)
fscanf(fp, "%c ", (data+i));
可以解决您的问题并且会更快。 此外,fscanf和fprintf旨在读/写格式化数据,而不是二进制字段。