小编Ole*_*828的帖子

Haskell中合理有效的纯功能矩阵产品?

我知道Haskell一点点,我想知道是否有可能在Haskell中编写类似于矩阵矩阵产品的东西,它具有以下所有特性:

  1. 纯函数:在其类型签名中没有IOStatemonad(我不关心函数体中发生了什么.也就是说,我不关心函数体是否使用monad,只要整个函数是纯的).我可能想在纯函数中使用这个矩阵矩阵乘积.
  2. 内存安全:没有malloc或指针.我知道在Haskell中"写C"是可能的,但是你会失去内存安全性.实际上用C编写这个代码并将其与Haskell连接也会损失内存安全性.
  3. 和Java一样高效.具体来说,我们假设我所说的是一个简单的三重循环,单精度,连续的列主要布局(float[]float[][])和大小为1000x1000的矩阵,以及一个单核CPU.(如果你每个周期得到0.5-2个浮点运算,你可能会在球场.)

(我不希望这听起来像是一个挑战,但请注意Java可以轻松满足以上所有要求.)

我已经知道了

  1. 三重循环实现不是最有效的.这是相当缓存 - 忘记了.在这种特殊情况下,最好使用编写良好的BLAS实现.但是,人们不能总是指望C库可用于尝试做什么.我想知道是否可以在普通的Haskell中编写合理有效的代码.
  2. 有些人写了完整的研究论文,证明了#3.但是,我不是计算机科学研究员.我想知道在Haskell中是否可以保持简单的事情.
  3. Haskell的Gentle简介有一个矩阵产品实现.但它不能满足上述要求.

致意见:

我有三个原因:首先,"没有malloc或指针"的要求尚未定义(我要求你编写任何不使用指针的Haskell代码);

我看到很多Haskell程序没有使用Ptr.也许它指的是在机器指令级别使用指针的事实?那不是我要表达的意思.我指的是Haskell源代码的抽象级别.

第二,对CS研究的攻击是不合适的(而且我无法想象比使用别人已经为你编写的代码更简单的事情); 第三,Hackage上有很多矩阵包(要求这个问题的准备工作应该包括审查和拒绝每个).

你的#2和#3似乎是相同的("使用现有的库").我对矩阵产品感兴趣,只是测试Haskell可以自己做什么,以及它是否允许你"简单易懂".我可以很容易地想出一个没有任何现成库的数值问题,但是我必须解释这个问题,而每个人都已经知道矩阵产品是什么.

Java如何可能满足1.?任何Java方法本质上都是 :: IORef Arg -> ... -> IORef This -> IO Ret

这是我问题的根源,实际上是(+1).虽然Java并没有声称追踪纯度,但Haskell确实如此.在Java中,注释中指出了函数是否纯粹.我可以声称矩阵产品是纯的,即使我在函数体中做了突变.问题在于Haskell的方法(在类型系统中编码的纯度)是否与效率,内存安全性和简单性兼容.

performance haskell functional-programming

19
推荐指数
3
解决办法
4527
查看次数

为什么malloc真的不确定?(的Linux/Unix)

malloc不保证返回0的内存.传统观点不仅如此,而且内存malloc返回的内容实际上是非确定性的,例如openssl将它们用于额外的随机性.

但是,据我所知,malloc建立在brk/sbrk之上,它可以"返回"0'ed内存.我可以看到为什么malloc返回的内容可能不是0,例如来自以前的免费内存,但为什么它们在"普通"单线程软件中是非确定性的呢?

  1. 传统智慧是否真实(假设相同的二进制和库)
  2. 如果是这样,为什么?

编辑几个人回答解释为什么内存可以是非0,我已在上面的问题中解释过.我问的是为什么使用malloc返回的内容的程序可能是非确定性的,也就是为什么它每次运行时都会有不同的行为(假设相同的二进制文件和库).非0表示非确定性行为.换句话说:为什么每次运行二进制文件时它都有不同的内容.

c malloc non-deterministic linux-kernel

8
推荐指数
2
解决办法
1363
查看次数

C++ 11被广泛支持吗?

对于那些希望他的C++代码可以在不同的C++编译器中移植的人来说,是时候开始使用C++ 11,还是在所有主要编译器支持新标准之前还需要一段时间(VC, GCC,CLang,英特尔)?

换句话说,主要编译器中C++ 11支持的状态是什么?

c++ c++11

7
推荐指数
1
解决办法
1205
查看次数

clang的-fcatch-undefined-behavior不像宣传的那样工作

我构建了llvm/compiler-rt/clang的3.1版本,我试图看看-fcatch-undefined-behavior是否真的做了什么.到目前为止,没有运气.我编译并运行

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* x = malloc(sizeof(int) * 10);
    printf("%d\n", x[20]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

$ /usr/local/bin/clang -fcatch-undefined-behavior undef_test.c && ./a.out
0
Run Code Online (Sandbox Code Playgroud)

我错过了一些非常简单的事吗?

c c++ clang undefined-behavior

5
推荐指数
1
解决办法
1324
查看次数

更改上次提交消息而不提交最新更改

我理想的工作流程包括以下步骤

  1. 编辑代码
  2. git commit -a -m"提交消息"
  3. 开始运行新的二进制文件,测试等(可能需要10多分钟)
  4. 在二进制文件仍在运行时启动新的更改
  5. 当步骤#4完成时,编辑步骤#3中的提交消息,而不提交步骤#5中引入的更改,例如添加"test FOO failed"

我无法使用git commit -a --amend -m "new commit message",因为这也会提交新的更改.我不确定我是否想要分期或分支.我希望我可以编辑提交消息而不提交任何新的更改.可能吗?

git

5
推荐指数
1
解决办法
2749
查看次数

如何使GCC打印有用的RUNTIME错误消息?

#define荷兰国际集团_GLIBCXX_DEBUG力GCC搭上一大类在C++运行错误,如外的边界STL访问,无效迭代器等的

不幸的是,当错误发生时,打印的消息不是很有帮助.我知道如何打印回溯跟踪的功能,以及__FILE____LINE__与宏自己.

是否有一种简单的方法可以说服GCC这样做,或者指定一个函数/宏,以便在_GLIBCXX_DEBUG发生实际发生的错误时调用它?

c++ gcc g++

5
推荐指数
1
解决办法
830
查看次数