我为两个矩阵的逐元素乘法构建了一个内核,但至少在我的配置下,我的 OpenCL 内核只有在每个矩阵大于 2GB 时才会更快。所以我想知道,这是因为我的内核(见下文)还是因为元素运算的性质,这意味着元素运算不会从使用 GPU 中获益。
感谢您的意见!
内核:
KERNEL_CODE = """
// elementwise multiplication: C = A .* B.
__kernel void matrixMul(
__global float* C,
__global float* A,
__global float* B,
int width, int height)
{
// ID
int x = get_global_id(0);
int y = get_global_id(1);
// Multiplying
C[y * height + x ] = A[y * height + x] * B[y * height + x];
}
"""
附注我读到一些专家认为,CUDA 与 OpenCL 差异太大,无法在同一个问题中同时回答这两个问题,可以随意将其从标题和标签中删除。
最佳答案
这种操作有 N 个 FLOP,但有 3N 个内存事务,因此它将完全受内存带宽限制。没有数据重用的余地,因此引用 CPU 版本的加速上限是 GPU 与 CPU 带宽的比率。这个数字很少超过 10 倍,并且会很快被将数据移入和移出 GPU 内存的成本所侵 eclipse 。一般来说,这种操作最好与其他 O(N) 操作“融合”以提高性能。您通常永远不会只在单个内核中计算 Hadamard 乘积,您会将其作为一个内核中一系列 O(N) 操作的一部分来执行。所以,不,这不是加速的理想选择,即使内核是最优的。
而您的内核肯定不是。您为每个 FLOP 执行 3 个 IOP,这是一个巨大的惩罚。你当然可以做一些事情来改善这一点,但是什么事情将完全取决于它将运行在什么样的硬件上。
https://stackoverflow.com/questions/6045473/