I\xc2\xb4m 目前正在尝试通过内存合并在 OpenCl 中转置矩阵。
\n\n我已经以“简单”的方式转换了矩阵,效果非常好。当我现在尝试使用内存合并做同样的事情时,我希望看到执行时间有一点改进,但我的实现实际上比简单的实现慢(实现是正确的,只是效率不高) 。我想我还没有完全理解如何确保水平相邻的工作项写入水平相邻的地址。
\n\n这是我的联合实现的内核:
\n\n__kernel void MatrixTranspose(__global const float* Matrix, \n__global float* MatrixTransposed, uint Width, uint Height, __local float* block) {\n\n int2 GlobalID;\n GlobalID.x = get_global_id(0);\n GlobalID.y = get_global_id(1);\n\n int2 LocalID;\n LocalID.x = get_local_id(0);\n LocalID.y = get_local_id(1);\n\n block[LocalID.y*get_local_size(0) + LocalID.x] = Matrix[GlobalID.y*Width + GlobalID.x];\n\n barrier(CLK_LOCAL_MEM_FENCE);\n\n int2 groupId;\n groupId.x = get_group_id(0);\n groupId.y = get_group_id(1);\n int2 localSize;\n localSize.x = get_local_size(0);\n localSize.y = get_local_size(1);\n MatrixTransposed[Height*(LocalID.x + groupId.x*localSize.x) + Height - (LocalID.y + groupId.y*localSize.y) - 1] = block[LocalID.y*localSize.x …Run Code Online (Sandbox Code Playgroud)