我正在测试一些使用OpenCL改进计算的方法。我写了一个程序,以天真的O(n ^ 3)方式多次运行100,000个随机生成的矩阵,并用简单的计时器测量它所花费的时间。我的电脑上大约需要16.5毫秒。
然后我写了一个(同样天真的)OpenCL实现,它做了同样的事情。这是我的内核代码:
// index of element in matrix
uint index(uint row, uint column)
{
return column*4 + row;
}
// a and b are buffers with all 200k matrices and c is a buffer to be filled with the result
__kernel void matrix_mul(__global float* a, __global float* b, __global float* c)
{
uint i = get_global_id(0);
c[i] = 0;
uint m = i/16; // index of matrix
m*=16; // offset of matrix
uint row = i%4; // row of current element within the matrix
uint col = i/4 % 4; // column of current element within the matrix
for(uint k=0; k<4; ++k)
{
c[i] += a[m + index(row, k)] * b[m + index(k, col)];
}
}
它在我的GPU上运行,比我之前编写的单线程CPU代码慢两倍(~39 ms)。当我强制OpenCL使用(4核)CPU时,它变得更慢 - 大约65毫秒。
我知道有更好的方法来增加矩阵,但这不是我的问题。我想知道为什么这么慢?人们会认为简单地并行化计算会至少改善执行...