cuda - OpenCL (Cuda) 中的逐元素运算

我为两个矩阵的逐元素乘法构建了一个内核,但至少在我的配置下,我的 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/

相关文章:

c - 如何在 Linux 中找到不同的内存段起始位置及其大小

mongodb - 我可以在 MongoDB 中存储关系数据库结构吗

delphi - 什么是重置(句柄,1)?

.net - Base64 编码替代下划线

sql - ManyToManyField 中 Django 中对象子集的不同值

image - 禁用从 Canvas 下载图像

php - 使用正则表达式阻止某些电子邮件提供商

asp.net - 在 asp 的 gridview 中使用 eval 获取 this 对象

math - 两次旋转之间的误差?

c# - BinaryWriter 问题 - "code adds some byte betwee