【发布时间】:2012-06-15 13:19:06
【问题描述】:
我有一个 100 万列 x 100 万行的矩阵。
我的算法需要做:
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;
}}
我的问题:为这个问题分配内存和初始化内存的正确方法是什么:
- 我应该为完整矩阵分配内存,用完整矩阵初始化它,然后运行算法吗?
- 还是应该为向量列表分配内存,然后循环遍历该列表?
- 不然呢??
我担心的是我想尽量减少到 GPU 的传输时间。我已经通过修改JCublas hello world example 来尝试这种计算,以对 2 个向量进行 sgemm 操作,但是在我的大量向量上执行此操作时,最终导致传输时间删除了 gpu 加速的好处。
谢谢! PS:实现可以在任何Java库中
【问题讨论】:
-
这是稀疏矩阵还是稠密矩阵? 32 位整数或浮点值的 100 万 x 100 万密集矩阵需要 4000 Gb 内存。这不仅不适合任何 GPU 内存,也不适合任何不需要专用数据中心的主机系统的内存。您打算在哪种机器上进行此操作?
-
@talonmies 我使用了一个包含 250,000 个双值稀疏向量的数组。任何向量的长度都是 1,100,000。 (code.google.com/p/matrix-toolkits-java/source/browse/trunk/src/… 向量 very 稀疏(平均填充 10 个值)。目前我可以在 i7-2860、16Gb 的笔记本电脑上使用多线程运行它,但需要几个小时。
标签: java opencl gpgpu jocl jcuda