gpt4 book ai didi

chapel - 尝试通过改善缓存局部性来改善矩阵乘法运行时间

转载 作者:行者123 更新时间:2023-12-04 10:55:36 26 4
gpt4 key购买 nike

我试图通过改善空间局部性来重新排列循环顺序来改善矩阵乘法的运行时间。我有一个在 C++ 中从我的类中执行此操作的示例,但尝试在 Chapel 中实现它导致我出现此错误。

var grid : [1..size, 1..size] uint(8);
var grid2 : [1..size, 1..size] uint(8);
var grid3 : [1..size, 1..size] int;
var grid4 : [1..size, 1..size] uint(8);
forall i in 1..size do
forall k in 1..size do
grid4 = grid[i,k];
forall j in 1..size do
grid3[i,j] += grid4 * grid2[k,j];
hello.chpl:20: error: 'i' undeclared (first use this function)
hello.chpl:20: error: 'k' undeclared (first use this function)

最佳答案

有两件事共同导致了这些错误:

1) Chapel 不是对空格敏感的语言。因此,例如,在 Python 中,语句的缩进表明它们彼此之间的关系,而在 Chapel 中则不是这种情况。在这方面,它更像是 C、C++ 或 Java,比如说。

2) do循环语句中的关键字(或条件语句中的 then 关键字)是一种简写形式,专用于其主体只有一条语句的控制结构。要创建在其主体中包含多个语句的循环或条件,您应该使用大括号指定复合语句。编写 Chapel 程序的一种防御性方法是始终使用大括号。请注意,我经常在幻灯片或 StackOverflow 帖子中使用速记,因为它更简洁。

因此,您编写的循环结构(正确缩进)如下:

forall i in 1..size do
forall k in 1..size do
grid4 = grid[i,k];
forall j in 1..size do
grid3[i,j] += grid4 * grid2[k,j];

这说明了为什么 ik在最后一个循环中无法访问 - 它们特定于前一个范围。一种解决方法是:
forall i in 1..size do
forall k in 1..size {
grid4 = grid[i,k];
forall j in 1..size do
grid3[i,j] += grid4 * grid2[k,j];
}

或者,在完全括号中的版本中:
forall i in 1..size {
forall k in 1..size {
grid4 = grid[i,k];
forall j in 1..size {
grid3[i,j] += grid4 * grid2[k,j];
}
}
}

理想情况下,一个好的 Chapel 编辑器模式将有助于保护您免受此类问题的影响,但目前只有少数这样的编辑器模式可用,而且它们的质量各不相同。在 Chapel 安装中,您将在 $CHPL_HOME/highlight 中找到 emacs 和 vim 模式。 (其中 emacs 模式往往不如 vim 模式成熟)。我相信网上也有一个原子模式(可能还有其他的),但我个人对它们并不熟悉。

但是,正如我所说,一种非常安全的编程方式是始终在控制流中使用大括号,在这种情况下,由于大括号不平衡,简单的错误通常会显示为语法错误。

关于chapel - 尝试通过改善缓存局部性来改善矩阵乘法运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59223449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com