关于多数据一次性或是分批读入的判断

大家好:
我有一个程序设计的问题。具体如下:
我有十万个文件(具体使用过程中可能更多),每个文件中包含11个点的坐标信息,我希望将这十万个文件中的坐标分别与第一个文件的坐标进行比较和计算,每次比较会得到一个数。最终输出100000*1的一个矩阵。因为这十万个数据相互之间无关系,所以我觉得这个过程通过GPU进行加速会很合适。如果用cpu实现,我会每次读入一个文件,与已经读入的第一个文件进行比较,得到值,并进行下一次循环。
我的问题是:
01.如果通过GPU实现,在最初始的时候,我需要将所有的数据都一次性读入吗?因为数据很大,不大可能一下子全部读入。如果全部读入,对之后使用GPU进行加速效率会很高吗。
02.如果通过GPU实现,在最初始的时候,我分批将数据读入,这个读入的数据应该是多大,我觉得这个和GPU的计算能力有关,有没有相关的评判标准或是限制之类的信息。
谢谢。

													2013年 11月 06日 星期三 09:12:14 CST

LZ您好:

首先,您的这个问题实际上对于数据传递而言有数据从您的磁盘文件到内存和从内存到GPU显存这两个环节,其中前者不属于本版的讨论范围,如果您的数据量确实十分巨大(您只说了有100000个文件,没有说每个文件多大,11个坐标点的信息有多少。),您需要评估一下整个过程是否会卡在您的磁盘IO时间上。

以下回答您的问题(仅考虑上面提到的第二个环节):

1:您并不需要一次性将数据完全读入显存,而且如果数据量确实十分巨大的话,显存也是不够用的,您可以分批读入,并且使用多stream,让计算时间和传输时间相互掩盖(此时推荐使用tesla卡)。
如果考虑全部读入,那么在读取的时候,您的GPU的计算部分是无法干活的,您不能只考虑后续的时间,而要考虑总时间是否划算。只要是在显存中的数据,GPU处理起来速度是一样的,那么多少用计算时间掩盖一些数据传输时间的话,总归要比干等着完全传输完再计算要快一点。

2:每次传输数据量,这个并无明显的限制,每次不要传输的数据量太小,否则通信开销较大。理想的情况下,如果您每次传入的数据的计算时间要比传入数据的时间长,那么总时间为计算时间+第一个数据块的传入时间;如果每次传入数据的计算时间要比传入数据的时间短,那么总时间为全体传入数据的时间。

此外,每块数据的传输时间长还是计算时间长,这个请勿纠结,因为您的算法已经固定,这个是不可改变的。以及,请尽量使用kepler核心或者fermi核心的tesla卡,更早的tesla卡,geforce卡可能不能很好地满足您的要求。

大致如此,祝您编码顺利~

To:Ice版
非常感谢您的回复。我消化一下先。

不客气的,欢迎您常来论坛~

我补充下ICE.

楼主您10W个文件,每个里面只有11个点的坐标么?

这样可能在文件读取上存在瓶颈。直接靠File System, 读取大量小文件,实际上很吃亏的。
建议楼主考虑使用简单的数据库进行存储,提高读取时候的效率(例如:SQLite).
或者楼主也可以简单合并这10W个文件为1个较大的文件。

当然,如果您的每个点的坐标,需要很大的数据量(例如,每个坐标有上千个分量),则您无需考虑本建议。

感谢来访。

To:横扫版
每个里面只有11个点的坐标。
如下。

22.403 36.176 49.920
21.881 36.097 51.343
21.640 35.019 51.899
21.624 37.272 51.910
21.366 37.556 53.307
21.588 39.047 53.495
20.790 39.755 52.573
19.985 37.086 53.756
20.033 36.267 54.667
18.833 37.463 53.192
17.496 36.962 53.449

因为是在linux下工作,可能通过一些方法将10W个数据分别存成若干个比较大一点的文件。分别进行读取。

“当然,如果您的每个点的坐标,需要很大的数据量(例如,每个坐标有上千个分量)”
分量只有三个,就是计算33个数和另外33个数据之间的差异。
sqrt(sum((xa_i-xb_i).^2+(ya_i-yb_i).^2+(za_i-zb_i).^2)/(n-1))
i=1:n
n=11
据说是在计算RMSD值。所以横扫版的建议,还是要认真参考的。