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