在GPU上将数千个4x4矩阵与OpenCL相比,比单线程CPU慢

时间:2014-11-01 23:12:21

标签: opencl

我正在测试一些使用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毫秒。

我知道有更好的方法来增加矩阵,但这不是我的问题。我想知道为什么这么慢?人们会认为简单地并行化计算会至少改善执行...

0 个答案:

没有答案