OpenCL(Cuda)中的元素操作

OpenCL(Cuda)中的元素操作,cuda,opencl,gpu,Cuda,Opencl,Gpu,我为两个矩阵的元素乘法构建了一个内核,但至少在我的配置中,当每个矩阵都大于2GB时,我的OpenCL内核速度更快。所以我想知道,这是因为我幼稚的内核(见下文)还是因为elementwise操作的本质,这意味着elementwise操作不会从使用GPU中获益 谢谢你的意见 内核: KERNEL_CODE = """ // elementwise multiplication: C = A .* B. __kernel void matrixMul( __global float*

我为两个矩阵的元素乘法构建了一个内核,但至少在我的配置中,当每个矩阵都大于2GB时,我的OpenCL内核速度更快。所以我想知道,这是因为我幼稚的内核(见下文)还是因为elementwise操作的本质,这意味着elementwise操作不会从使用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];
}
"""

p、 我读到一些专家认为,CUDA与OpenCL在同一个问题上差异太大,无法回答这两个问题,因此可以自由地将其从标题和标签中删除。

这种操作有N次触发器,但有3N次内存事务,因此它将完全受内存带宽限制。不存在数据重用的范围,因此参考CPU版本的加速上限是GPU与CPU带宽的比率。这个数字很少超过10倍,而且数据进出GPU内存的成本会很快降低。一般来说,这类操作最好与其他O(N)操作“融合”,以提高性能。您通常不会在单个内核中计算Hadamard乘积,而是将其作为一个内核中一系列O(N)操作的一部分。因此,不,这不是一个很好的加速候选,即使内核是最优的


而你的内核肯定不是。每一次失败你都要做3次IOPs,这是一个巨大的惩罚。您当然可以做一些事情来改进这一点,但什么事情将完全取决于这将在什么样的硬件上运行

说到元素操作:这取决于设备。例如,NVidia GPU使用标量处理器(带有标量指令),不需要矢量化。相反,ATI采用5d(或4d)VLIW处理器,矢量化对这些处理器至关重要。然而,它有时可以由编译器执行,而不是直接在代码中使用矢量数据类型,但这是为ATI的GPU进行优化时要做的第一件事


然而,正如Talonmes所指出的,上面的算法几乎没有内存带宽限制,您不能仅仅为了它而使用GPU来等待太多的加速。

您发布的内核应该至少与CPU内核一样快。但您根本没有使用合并内存访问

这会毁了你的表演


然而,正如@Talonmes所说的那样。对于GPU来说,这不是一个很好的例子。您正在丢失内存拷贝中的所有时间。

检查在启动内核时浪费了多少时间。你把这和什么比较?cpu上的相同操作?