我在矢量化循环时遇到了麻烦。我正在寻找重写下面的代码,使其矢量化。我已经运行了 Complete Banerjee 的测试,我发现所有依赖项都被破坏了,但我不知道从哪里开始。编译器是gcc。体系结构是 x86,数组是整数数组。
for (int i = 0; i < 100; i++) {
x[20 + i] = y[i] * z[i];
p[i] = x[21 + i] + q[i];
}
Run Code Online (Sandbox Code Playgroud) c parallel-processing optimization cluster-computing vectorization
我有一个问题,我的 if 块(和 Do-While 块,因为问题是相同的)的解析器不会在解析字符串“fi”时终止。If-Block 采用以下形式:
if P -> p
[] Q -> q
fi
Run Code Online (Sandbox Code Playgroud)
如果我使用Text.Parsec的字符串解析器来解析,"fi"就像我使用它来解析"if"甚至进入循环一样,程序会停止。当我打印出应该评估的内容时,它甚至不存在,因此程序在以"fi".
"fi"然而,当我删除解析的解析器时,发生的情况是程序可以运行并且 If-Block 的评估符合预期,但我必须以与块"fi"中表达式相同数量(或任何字符串)的数量结束块本身。如果我没有以相同数量的"fi"'s结束块,那么在无限评估块之后的任何语句都会发生什么。例如,如果变量为偶数,则向运行总数加 1 的块将如下所示:
if ((x mod 2) = 0)-> r := r + 1
[] ((x mod 2) = 1)-> r := r + 0
fi
fi
Run Code Online (Sandbox Code Playgroud)
如果有一个"fi",并且我在块之后打印了 r 的值,它将无限打印 r
if ((x mod 2) = 0)-> r := r + 1
[] ((x mod 2) = …Run Code Online (Sandbox Code Playgroud) 我正在用 Haskell 编写一种简单的语言,但在计算算术和关系表达式时遇到了问题。起初我编写了一个评估函数,然后我意识到我需要单独的函数来评估我语言的各个方面。所以我有一个算术评估函数,一个关系评估函数,然后是一个通用评估函数。
问题来自于实际生产一些可以使用的东西,我认为这是因为无法将我的其他 eval 函数与我的主要 eval 函数联系起来。但是,我不确定我是否错误地进行了评估。我相信也许像“foldl1”这样的函数在评估中实施会更有用。我第一次从 48 小时内编写自己的计划 Wikibook 中了解到这个函数,它似乎比评估每个可能的表达式更有用。我不确定这将如何在我当前的代码中实现,除非我为每个表达式都有一个函数。例如,如果我有一个像“1 + 1”这样的表达式,我当前的解析器会将其解析为“1 Add 1”,但如果我使用 foldl1,我可以有一个函数来获取这个表达式的每个部分,并在参数上“折叠”运算符。即使我将当前的评估函数与 foldl1 的想法合并,我仍然预见到从它评估任何有意义的东西(不仅仅是整数或字符串)的问题。
任何方向或帮助将不胜感激。
下面我通过数据类型和我的评估功能包括在内:
data HenryVal = Atom String
| String String
| Integer Integer
| Bool Bool
| Not HenryVal
| Neg HenryVal
| List [HenryVal]
| Seq [HenryVal]
| Assign String HenryVal
| If HenryVal HenryVal HenryVal
| While HenryVal HenryVal
| Skip
| ABinary ABinOp HenryVal HenryVal
| BBinary BBinOp HenryVal HenryVal
| RBinary RBinOp HenryVal HenryVal
data BBinOp = …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个简单的堆栈,但我很困惑为什么当我将一个整数推送到堆栈时会得到一个无限列表。
所有其他功能都按我的预期工作,但我不明白push. 当我尝试为自己分配一个空堆栈时出错,该堆栈已推送如下变量:
? > a = makeStack
? > push 3 a
[3]
? > a
[]
? > a = push 3 a
? > a
[3,3,3,3,3,3,3,3,3,3^CInterrupted.
Run Code Online (Sandbox Code Playgroud)
type Stack a = [a]
makeStack :: Stack a
makeStack = []
push :: a -> Stack a -> Stack a
push a as = (a:as)
Run Code Online (Sandbox Code Playgroud)