我有一百万列x一百万行的矩阵。用gpgpu做大量矢量计算的最佳方法是什么?
我algoritm需要做的:
Matrix m = Matrix(rows,cols)
for (colB: cols){
vector currColA = m.getcolumn(colA)
for (colB: cols){
vector currColB = m.getcolumn(colB)
result = currColA.dotProduct(colB)
return result;
}}
或者你也可以说:
Vectors [] v = Vectors[]
for (i: v.length){
vector v1 = v[i]
for (i: v.length){
vector v2 = v[i]
result = v1.dotProduct(v2)
return result;
}}
我的问题:什么是分配内存和初始化内存的正确方法这个问题:
- 我应该为整个矩阵分配内存,用全矩阵初始化它, d然后运行算法?
- 或者我应该分配一个向量列表的内存,然后遍历这个列表?
- 否则??
我担心的是我想尽量减少传输时间到GPU。我试图通过修改JCublas hello world example以在2个矢量上进行sgemm操作来尝试这种计算,但是当在大量矢量上进行sgemm操作时,结果是传输时间删除了gpu加速的好处。
Thx! PS:实现可以在任何Java库中
这是一个稀疏或密集的矩阵?一个100万×100万的32位整数或浮点值的密集矩阵需要4000 Gb的内存。这不仅不适合任何GPU内存,也不适合任何不需要专用数据中心的主机系统的内存。你打算做什么样的机器? – talonmies
@talonmies我使用一个包含250,000个双值稀疏向量的数组。任何矢量的长度是1,100,000。 (http://code.google.com/p/matrix-toolkits-java/source/browse/trunk/src/no/uib/cipr/matrix/sparse/SparseVector.java?r=46)。向量*非常稀疏(平均10个值被填充)。目前,我可以使用i7-2860,16Gb笔记本电脑上的多线程来运行它,但需要几个小时。 – seinecle