【发布时间】:2014-10-21 03:19:15
【问题描述】:
我是 OpenCL 的新手,并试图了解如何优化矩阵乘法以熟悉各种范式。这是当前代码。 如果我将矩阵 A 和 B 相乘。我在私有内存中分配 A 行作为开始(因为每个工作项都使用它),并在本地内存中分配 B 列(因为每个工作组都使用它)。
1) 代码当前不正确,不幸的是我正在努力研究如何使用本地工作 ID 来获取正确的代码,但我找不到我的错误?我以http://www.cs.bris.ac.uk/home/simonm/workshops/OpenCL_lecture3.pdf 为基础,但是(幻灯片 27)这似乎是错误的,因为他们没有在内部循环中使用 loc_size)
2) 您对此代码还有什么其他优化建议吗?
__kernel void mmul(
__global int* C,
__global int* A,
__global int* B,
const int rA,
const int rB,
const int cC,
__local char* local_mem)
{
int k,ty;
int tx = get_global_id(0);
int loctx = get_local_id(0);
int loc_size = get_local_size(0);
int value = 0 ;
int tmp_array[1000];
for(k=0;k<rB;k++) {
tmp_array[k] = A[tx * cA + k] ;
}
for (ty=0 ; ty < cC ; ty++) { \n" \
for (k = loctx ; k < rB ; k+=loc_size) {
local_mem[k] = B[ty + k * cC] ;
}
barrier(CLK_LOCAL_MEM_FENCE);
value = 0 ;
for(k=0;k<rB;k+=1) {
int i = loctx + k*loc_size;
value += tmp_array[k] * local_mem[i];
}
C[ty + (tx * cC)] = value;
}
}
我在哪里设置全局和本地工作项如下
const size_t globalWorkItems[1] = {result_row};
const size_t localWorkItems[1] = {(size_t)local_wi_size};
local_wi_size 是 result_row/计算单元数(这样 result_row % 计算单元 == 0)
【问题讨论】:
-
您的代码示例是否得到正确的结果?您是否尝试过使用较小的矩阵?什么是全局和本地工作维度?