小编Kon*_*dej的帖子

编译的加速代码的性能差异来自ghci和shell

问题

您好,我正在使用加速库来创建一个应用程序,允许用户以交互方式调用处理图像的函数,这就是为什么我要使用ghc api来扩展ghci.

问题是当从shell运行已编译的可执行文件时,计算在100ms(略小于80)下完成,而在ghci中运行相同的编译代码则需要超过100ms(平均大于140)才能完成.

资源

示例代码+执行日志:https: //gist.github.com/zgredzik/15a437c87d3d8d03b8fc

描述

首先:测试是在编译CUDA内核之后运行的(编译本身又增加了2秒,但事实并非如此).

从shell运行已编译的可执行文件时,计算在10ms内完成.(shell first runsecond shell run传递不同的参数以确保数据不会缓存在任何地方).

当尝试从ghci运行相同的代码并摆弄输入数据时,计算时间超过100毫秒.我理解解释的代码比编译的代码慢,但是我在ghci会话中加载相同的编译代码并调用相同的顶级绑定(packedFunction).我已明确键入它以确保它是专门的(与使用SPECIALIZED编译指示相同的结果).

但是,如果我main在ghci中运行函数(即使:set args在连续调用之间更改输入数据),计算确实需要不到10毫秒.

编译Main.hsghc -o main Main.hs -O2 -dynamic -threaded

我想知道开销来自哪里.有没有人有任何关于为什么会这样的建议?


remdezx发布的示例的简化版本:

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Data.Array.Accelerate as A
import Data.Array.Accelerate.CUDA as C
import Data.Time.Clock       (diffUTCTime, getCurrentTime)

main :: IO ()
main = do
    start <- getCurrentTime
    print $ C.run $ A.maximum $ A.map (+1) …
Run Code Online (Sandbox Code Playgroud)

performance profiling haskell ghci accelerate-haskell

33
推荐指数
1
解决办法
1110
查看次数

Emscripten - 支持纯html5画布的C++(不是WebGL)

使用emscripten时,有没有办法在C++下访问canvas 2D上下文?
我希望能够得出使用帆布的API功能,如简单的形状/路径lineTo,fillRect1D完成,等等.(所以基本上使用任何列出的功能在这里.

我将指出我宁愿不依赖SDL,但如果它是唯一可靠的方法,那么是否有办法强制它编译为JavaScript以便结果不会使用WebGL,而是基本的canvas api?

或者我应该按照这个建议做一个简单的api函数映射:从C/C++调用JavaScript

在任何人分享更好的解决方案之前,我很可能会完成映射并在我完成后立即在此处共享.

javascript c++ canvas emscripten

18
推荐指数
1
解决办法
6471
查看次数

QML - 跟踪组件的全局位置

我想跟踪一个对象的全局位置(或相对于它的一个祖先)并将其绑定到其他项目的位置.

我正在考虑使用mapFromItem如下:

SomeObject {
  x: ancestor.mapFromItem(trackedObject, trackedObject.x, 0).x
  y: ancestor.mapFromItem(trackedObject, 0, trackedObject.y).y
}
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是,它mapFromItem被评估一次,并且不会更新,因为其中一个参数得到更新.此外,映射有时返回由我无法在代码中跟踪的偏移量改变的新位置(但这不是手头的问题).

我的第二个想法是通过实现一个函数来计算全局位置,该函数将递归地求和偏移量,停止在提供的祖先(类似的东西calculateOffsetFrom(ancestor)).这仍然只是一个函数,就我而言,它不会被重新评估为祖先位置变化之一(除非,在该函数中,我将绑定调用它的onXChanged每一个信号的信号)沿途的祖先,这似乎是一个肮脏的解决方案).

所以最后我已经添加了我想要跟踪的对象的属性,然后我绑定到它们:

TrackedObject {
  property real offsetX: x + parent.x + parent.parent.x + parent.parent.parent.x ...
  property real offsetY: y + parent.y + parent.parent.y + parent.parent.parent.y ...
}

SomeObject {
  x: trackedObject.globalX
  y: trackedObject.globalY
}
Run Code Online (Sandbox Code Playgroud)

但是......好吧......这个根本不会扩展,而且会像它那样难看.

有谁知道如何以更清洁的方式解决这个问题?

编辑: 据我所知,在这种情况下我不能使用锚点.该SomeObject组件是一个自定义组件,从一个点到另一个点绘制贝塞尔曲线(它将连接两个TrackedObjects).为此,我需要坐标之间的差异.如果我是正确的锚,则不提供任何计算它们之间距离的方法.

qt qml qt-quick qtquick2

12
推荐指数
1
解决办法
1万
查看次数

QML - MouseArea - 传播onPositionChanged

是否有可能将一个MouseAreapositionChanged事件传播给一个基础事件?

我试图设置mouse.acceptedfalse为最上面的任何现有的信号处理程序MouseArea,以及设置propagateComposedEventstrue.这些都没有起作用(虽然我对propagateComposedEvents并不工作并不感到惊讶,因为文档说它只传递类似的事件clicked,doubleClickedpressAndHold).

qt qml qt-quick qtquick2

12
推荐指数
1
解决办法
4416
查看次数

HTML5 Canvas绘制的颜色与提供的颜色不同

将某种颜色设置为fillStyle画布并绘制矩形后fillRect,矩形的颜色有时会与提供的颜色getImageData略有不同(返回不同的值 - 通常其中一个值低1).它似乎只发生在使用rgba颜色时(而不是使用颜色rgb),但实际上我确实需要使用alpha通道.

对于想要研究这个问题的人,我为js小提琴制作了一个简单的测试套件:http: //jsfiddle.net/LaPdP/1/

关于为什么会发生这种情况的任何想法,以及是否有任何方法可以解决这个问题?如果它至少总是发生在相同的值上,那么我只是通过将它增加1来绕过它,但对我来说它似乎很随机.

javascript html5 canvas getimagedata

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

QML - 解决祖先问题

我有一个容器,它在运行时被动态创建的组件填充.每个元素(让我们称之为DynamicObjects)都有一个子元素树Node,也是动态创建的.更重要的是,Node组件可以彼此嵌套(如树结构).

让容器将id参数设置为,"main_container"并将每个参数DynamicObject设置为"dynamic_object".

每当我尝试main_container从任何嵌套Node元素中解决它时,一切正常.问题是当我试图解决除了根目录之外的dynamic_object任何Node一个(一个是直接后代/孩子dynamic_object).它导致:

ReferenceError:未定义dynamic_object

我的问题是:这种行为背后可能是什么原因?它可以与这些对象动态创建的事实有关吗?(这是我的第一个想法,因为我总能解决它main_container,它在qml代码中静态声明).

代码示例:(如果有任何遗漏,请在评论中告诉我)

// Container.qml

import "container_logic.js" as Logic

Rectangle {
  id: main_container

  Keys.onTabPressed: {
    Logic.createComponent("DynamicObject.qml", {/* some parameters */});
    var dynamic_object = Logic.object;

    Logic.createComponent("Node.qml",{labelText: "asdefg"}, undefined, dynamic_object)
    var asdefg = Logic.object;
    Logic.createComponent("Node.qml",{labelText: "tree A"}, undefined, dynamic_object)
    var tree_a = Logic.object;

    Logic.createComponent("Node.qml",{labelText: "a"}, undefined, asdefg)
    var a = Logic.object; …
Run Code Online (Sandbox Code Playgroud)

qt qml qt-quick qtquick2

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

是否可以添加/启动一个新的git子模块,并将ignore选项设置为某个值?

我有一个脚本为我和我的同事建立了一个项目.我们在我们的存储库中使用git子模块.我制作的脚本在子模块的目录中创建了未跟踪的配置文件(cabal的沙盒配置文件更具体).我永远不会修改子模块,永远不会推动任何更改.我希望这些配置文件不被列为对存储库的修改,因此我使用子模块选项忽略它们ignore = untracked.但是,我必须手动为.git/config文件中的每个子模块条目执行此操作.

眼下的问题:是否有可能在调用时设置每个子模块该选项git submodule addgit submodule init?如果没有,是否有任何git命令允许我在初始化后为每个模块设置这样的配置变量?

git automation gitignore git-submodules

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