我想用值 C*B 更新 C。我还想用值 C*C 更新 C。
这样做安全吗?我不想给我的学生提供糟糕的代码。我目前正在将临时结果从 cblas_gemm(...) 复制回 C 矩阵...这很慢。
如果使用相同的矩阵作为输入和输出是安全的,那么 BLAS 实现将需要使用临时工作区。由于您没有提供这样的工作空间,因为该函数没有请求这样的工作空间,因此我们可以得出结论,您不能使用相同的矩阵作为输入和输出。
事实上,如果 BLAS 例程要接受一个参数作为输入和输出,那么它将通过使用一个参数而不是两个参数并记录该参数用于输入和输出来实现这一点。
你说使用临时输出变量然后在 BLAS 调用后进行复制很慢。但与矩阵乘法相比,该复制操作应该是微不足道的。你确定副本是瓶颈吗?你计时了吗?
BLAS 标准(可在此处获取)只是说:
该例程执行一般矩阵矩阵乘法,其中...A、B 和C 是一般矩阵。
所以,我想说它是实现定义的,你可以假设这样做可能不安全。但是,如果您使用特定的实现,您可以随时检查该实现的来源。
或者,正如评论者建议的那样,SYRK 可能会做你想做的事。
我想用值 CB 更新 C。我还想用值 CC 更新 C。这样做安全吗?
不。
cgemm
和朋友要求输入和输出矩阵不重叠。
我目前正在将临时结果从 cblas_gemm(...) 复制回 C 矩阵...这很慢。
复制并不慢。
memcpy
是 O(n),常数因子非常低。矩阵乘法是 O(n^2),具有更高的常数因子。
也许您不是使用
memcpy
,而是使用嵌套 for
循环逐个元素地复制矩阵,并在未优化(调试)构建中执行此操作?
或者您不断分配和取消分配临时矩阵?如果需要临时矩阵的计算重复多次,则分配该矩阵一次并保留分配状态,直到需要结束为止。