【发布时间】:2012-03-13 21:40:49
【问题描述】:
我正在为一个专门的矩阵函数编写一段 OpencL 代码:对于一个 Dx1 向量 v,两个 DxD 矩阵 A 和 B 和一个常量 c,返回 @987654327 @矢量r其中r[i] = c * sum_over_j (v[j] * A[i][j] * B[i][j])
以下是我目前所拥有的,但运行速度非常慢。返回DxD 矩阵的不求和版本大约快十倍。如果这有什么不同,它会从 PyOpenCL 中调用。
有什么做错了吗?可以优化吗?
#define D 1000
...
__kernel void element_mult(
__global float *result,
__global const float *vector,
__global const float *matrix,
__global const float *matrix2,
const float factor)
{
int y = get_global_id(1);
float sum = 0;
for(int k = 0; k < D; k++)
{
sum += vector[k] * matrix[(y*D) + k]
* matrix2[(y*D) + k ];
}
result[y] = sum * factor;
}
干杯!
【问题讨论】:
-
您确定 yD 的计算是由您的编译器从 k 循环中提取出来的吗?并且公共子表达式 (yD)+k 在每次迭代中只计算一次?
-
您是否在 NVIDIA GPU 上运行此程序?
-
@talonmies,我不能确定。计算不是在我的计算机上本地完成的;基本上它只需要是 OpenCL。
-
@trolle3000:您的代码使用的内存访问模式对于 NVIDIA GPU 上的性能将非常不利,如果这恰好是目标的话。这个计算实际上是两个矩阵与向量的 Hadamard 积的点积?
-
@talonmies,没错。您能否详细说明内存访问模式?