16k乘以16k的float矩阵做转置

rabbitjerry 2013-08-08 10:29:57
在一个文件里存了16k×16k的float型裸数据,一共是1GB,想做转置操作,存在另一个文件里。
目前的想法是:
设置一个开辟的内存上限,例如128MB,开两个这么大的内存块,一个存读的,一个存写的。
然后读取原数据中的若干列,如果设置的是128MB,那么一共可以读取 128M / 16k / sizeof(float) = 2k列。
也就是说,在外层循环读取块数据,所以一共读取16k /2k = 8次。
当然每块是没法一次读的,因为数据是非连续的。fread每次只能读2k个数。一次大循环需要执行16k次。
所以fread一共调用了 16k * 8 = 128k次。
fwrite可以一次写一大块,调用8次就可以了。
但是这样做还是有点慢,大概需要100s,有没有更好的法子?
因为数据不一定是1GB,可能还更大,所以暂时不考虑开辟一个大内存,将整个数据读进来。
...全文
229 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rabbitjerry 2013-08-11
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
同步io换异步io block单位别做16k*2k做8k*4k
谢谢,不过不是太明白同步io换异步io的含义。 另外,8k×4k只是读取的次数少了一半,是这样吗?
FancyMouse 2013-08-09
  • 打赏
  • 举报
回复
同步io换异步io block单位别做16k*2k做8k*4k

2,408

社区成员

发帖
与我相关
我的任务
社区描述
高性能计算
社区管理员
  • 高性能计算社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧