我对Cuda C相当新,我在使用ofstream
在Cuda C中导出大型2D阵列时遇到问题。代码工作正常,但性能并不是我所期望的。除fstream
之外还有其他更快的方法吗?我尝试使用ostringstream
,但它并没有真正显示任何改进。
HANDLE_ERROR( cudaMemcpy( sseismo, seismo,sizeof(float)*(DIMX*samp),cudaMemcpyDeviceToHost ) );
sprintf(nmfile, "seismo%ix%itau%08ivz.txt",4000,4000,1 );
std::ofstream outseis(nmfile); // output, normal file
for (int jj=0; jj<4000; jj++)
{
for (int ii=0; ii<4000; ii++)
{
int ij=(DIMX)*jj + ii;
outseis<<sseismo[ij]<<" ";
}
outseis<<"\n";
}
outseis.close();
答案 0 :(得分:2)
您可以以二进制格式而不是文本格式输出数据。
outseis.write((char*)sseismo[jj*(DIMX)], 4000*sizeof(sseismo[0]));
否则outseis<<
几乎是您可以获得的最快的文本输出。
有关std::ofstream::write
答案 1 :(得分:0)
如果不能编写二进制数据,可以通过将内部循环写入字符串流并将其写入文件(我得到1.317ms而不是~1.700ms)来挤压几百毫秒。
#include <fstream>
#include <sstream>
int main()
{
const char nmfile[] = "out.txt";
std::ofstream outseis(nmfile); // output, normal file
for (int jj=0; jj<4000; jj++)
{
std::stringstream buf;
for (int ii=0; ii<4000; ii++)
{
int ij = jj + ii;
buf<<ij<<" ";
}
outseis << buf.str() << "\n";
}
outseis.close();
}