使用Cuda C将大型2D阵列导出到文件中的更快方法

时间:2013-08-21 17:25:13

标签: c++ c

我对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();

2 个答案:

答案 0 :(得分:2)

您可以以二进制格式而不是文本格式输出数据。

outseis.write((char*)sseismo[jj*(DIMX)], 4000*sizeof(sseismo[0]));

否则outseis<<几乎是您可以获得的最快的文本输出。

有关std::ofstream::write

的更多信息,请参阅此处

http://en.cppreference.com/w/cpp/io/basic_ostream/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();
}