有没有更好的方法从makefile中获取设置env变量的脚本?
FLAG ?= 0
ifeq ($(FLAG),0)
export FLAG=1
/bin/myshell -c '<source scripts here> ; $(MAKE) $@'
else
...targets...
endif
Run Code Online (Sandbox Code Playgroud) uint64_t n; // two 32-bit integers
return ( (uint32_t)(n >> 32) == (uint32_t)n );
Run Code Online (Sandbox Code Playgroud)
将32个最高有效位与uint64_t的32个最低有效位进行原子比较的最快方法是什么?
我认为一个可怕的解决方案是:获取自旋锁,读取32 LSB,读取32 MSB,比较得到结果,释放自旋锁,返回结果.有没有办法做到这一点,而不必采取螺旋锁?
我试图将并行性添加到将.bmp转换为灰度.bmp的程序中.我发现并行代码的性能通常会低2-4倍.我正在调整parBuffer/chunking大小,但似乎仍无法推理它.寻找指导.
这里使用的整个源文件:http://lpaste.net/106832
我们Codec.BMP用来读取由...表示的像素流type RGBA = (Word8, Word8, Word8, Word8).要转换为灰度,只需在所有像素上映射"亮度"变换.
串行实现字面意思是:
toGray :: [RGBA] -> [RGBA]
toGray x = map luma x
Run Code Online (Sandbox Code Playgroud)
测试输入.bmp是5184 x 3456(71.7 MB).
串行实现运行在~10s,~550ns /像素.Threadscope看起来很干净:

为什么这么快?我想它有懒惰的ByteString(即使Codec.BMP使用严格的ByteString - 这里是否发生了隐式转换?)和融合.
添加并行性
添加并行性的第一次尝试是通过parList.好家伙.该程序使用~4-5GB内存并开始交换系统.
然后我读了Simon Marlow的O'Reilly书中的"使用parBuffer并行化Lazy Streams"部分并尝试parBuffer了大尺寸.这仍然没有产生理想的性能.火花尺寸非常小.
然后我尝试通过分块懒惰列表然后坚持parBuffer并行性来增加火花大小:
toGrayPar :: [RGBA] -> [RGBA]
toGrayPar x = concat $ (withStrategy (parBuffer 500 rpar) . map (map luma))
(chunk 8000 x)
chunk :: Int -> [a] -> [[a]]
chunk n [] …Run Code Online (Sandbox Code Playgroud) 你将如何在x86中实现128位原子操作?
英特尔系统编程指南,第1部分,8.1锁定原子操作指定保证16位,32位和64位原子操作.那么,你能用2个带有LOCK前缀的64位操作来实现128位原子操作吗?就像是...
LOCK mov 64bits->addr
LOCK mov 64bits->addr+64bits
Run Code Online (Sandbox Code Playgroud)
显然,SSE具有128位XMM寄存器.你能用这些寄存器进行128位比较和交换吗?
我正在研究Typeclassopedia中的Functors部分.
一个简单的直觉是Functor代表某种"容器",以及将函数统一应用于容器中的每个元素的能力.
好.因此,对于像列表或树这样的归纳类型,仿函数看起来非常自然.
如果元素的数量固定为较小的数字,Functors也会显得非常简单.例如,使用Maybe你只需要关注"Nothing"或"Just a" - 两件事.
那么,你如何制作类似图形的东西,可能有循环,一个Functor的实例?我认为更普遍的方式是,非归纳类型如何"适应"Functors?
我越是想到它,我就越意识到归纳/非归纳并不重要.归纳类型更容易定义fmap...
如果我想将图形作为Functor的一个实例,我将不得不在fmap中实现图形遍历算法; 例如,它可能必须使用一个辅助函数来跟踪被访问的节点.在这一点上,我现在想知道为什么还要把它定义为Functor而不仅仅是把它作为一个函数本身?例如地图vs fmap列表......?
我希望有经验,有战争故事和伤疤的人可以解释一下.谢谢!
基本上,我会把它描述为一个联合/合并[(,)]与一对正在运行的累加器snd......这是否有一种优雅的方式来实现它?
(请仅在回答问题的上下文中引用我的代码.如果您想查看我的代码,那也会很棒,但请在其他网站上执行此操作:https://codereview.stackexchange.com/questions/54993 /合并时间序列)
时间序列,
data Model a where
Variant :: [(Day, a)] -> Model a
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
...其中type ain [(Day, a)]基本上代表"总余额",例如银行账户.
一些示例数据,
day1 = fromGregorian 1987 10 17
day2 = fromGregorian 1987 10 18
day3 = fromGregorian 1987 10 19
day4 = fromGregorian 1987 10 20
day5 = fromGregorian 1987 10 21
day6 = fromGregorian 1987 10 22
m1 = Variant [(day1, 1), (day3, 3), (day5, 5)] :: Model Integer …Run Code Online (Sandbox Code Playgroud) 如果我尝试使用linky过滤代码段,则不再对输入进行清理/渲染/'html-ized'.即我希望能够结合两者的效果:
<div ng-bind-html="snippet"></div>
Run Code Online (Sandbox Code Playgroud)
和
<div ng-bind-html="snippet | linky"></div>
Run Code Online (Sandbox Code Playgroud)
这是小提琴:http://jsfiddle.net/5uSnj/
当我运行以下python示例代码时,
tick = 0
while True:
tick += 1
print tick
data = s.recv(1024)
if (tick == 1) and data:
print 'from client: %s' %(data)
elif (tick == 2) and data:
print 'from client: %s' %(data)
Run Code Online (Sandbox Code Playgroud)
我知道了,
1
from client: client msg
2
from client: ?
3
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我第二次调用s.recv()实际上返回了一些数据.我相当肯定客户端没有发送`?' 字符.
所以我修改了希望打印`data'的第一个字节的代码,
elif (tick == 2) and data:
print 'from client: %s' %(data)
print struct.unpack("!B", data)
Run Code Online (Sandbox Code Playgroud)
但后来我得到一个回溯声明:"struct.error:unpack需要一个长度为1的字符串参数."
struct包似乎是处理套接字数据的标准方法.但是,这种情况似乎很奇怪.我通过打印和看到"?"来直观地接收数据.并且代码在条件中也有"和数据"但我无法解压缩.
是否有不同的方法来处理套接字的二进制数据?
什么是最优雅的方式来解决这个问题:
{
'a': 'aa',
'b': 'bb'
}
Run Code Online (Sandbox Code Playgroud)
进入这个:
[
['a', 'aa'],
['b', 'bb']
]
Run Code Online (Sandbox Code Playgroud)