小编Dan*_*Dan的帖子

矩阵转置中的缓存利用率c

该代码以四种方式转换矩阵.第一个是顺序写入,非顺序读取.第二个是相反的.接下来的两个是相同的,但缓存跳过写入.似乎发生的是顺序写入更快,并且跳过缓存更快.我不明白的是,如果跳过缓存,为什么顺序写入仍然更快?

QueryPerformanceCounter(&before);
for (i = 0; i < N; ++i)
   for (j = 0; j < N; ++j)
      tmp[i][j] = mul2[j][i];
QueryPerformanceCounter(&after);
printf("Transpose 1:\t%ld\n", after.QuadPart - before.QuadPart);

QueryPerformanceCounter(&before);
for (j = 0; j < N; ++j)
   for (i = 0; i < N; ++i)
     tmp[i][j] = mul2[j][i];
QueryPerformanceCounter(&after);
printf("Transpose 2:\t%ld\n", after.QuadPart - before.QuadPart);

QueryPerformanceCounter(&before);
for (i = 0; i < N; ++i)
   for (j = 0; j < N; ++j)
      _mm_stream_si32(&tmp[i][j], mul2[j][i]);
QueryPerformanceCounter(&after);
printf("Transpose 3:\t%ld\n", after.QuadPart - before.QuadPart);

QueryPerformanceCounter(&before);
for …
Run Code Online (Sandbox Code Playgroud)

c caching computer-architecture

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

git认为文件已经改变

我在一台机器上做了一些项目的工作,然后推送到github,在另一台机器上克隆并做了一些工作,然后推了推.然后我回到第一台机器做了一个pull.现在,第一台机器认为项目中的所有文件最初都已更改.我试过了

git checkout -f --
Run Code Online (Sandbox Code Playgroud)

git rm --cached -r .
git checkout -f
Run Code Online (Sandbox Code Playgroud)

甚至尝试过

git stash
Run Code Online (Sandbox Code Playgroud)

但不管我做什么,git status告诉我那些文件已被更改.我怎么让它停下来?

windows git

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

返回 vim 中的 } - 相当于 [} 或 ]{

在 vim 中,我可以点击[{返回到第一个未匹配的位置{]}同样前进。有没有什么(短的)可以[}让我回到最后一个}

vim

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

如何动态语言JITted?

在动态语言中,动态类型化代码JIT如何编译成机器代码?更具体地说:编译器是否在某些时候推断出类型?或者在这些情况下是否严格解释?

例如,如果我有类似下面的pseuocode

def func(arg)
    if (arg)
        return 6
    else
        return "Hi"
Run Code Online (Sandbox Code Playgroud)

在运行代码之前,执行平台如何知道函数的返回类型是什么?

jit dynamic-languages

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

使用Haskell存储大型结构化二进制数据

我正在编写一个与大型(10-1000 GB)内存映射二进制文件交互的应用程序,基本上保存了一堆相互引用的对象.我想出了一种读取/写入这些数据的机制,这种机制既有效又丑陋(imo).

问:有没有更优雅的方式来实现我的目标?

我有结构化数据类型类一个,其中一个方法,它读取结构成一个Haskell数据类型(DataOp是一个ReaderT围绕IO).

class DBStruct a where
    structRead :: Addr a -> DataOp a
Run Code Online (Sandbox Code Playgroud)

为了使这个更具可读性,我有另一个类型类定义了哪些结构成员去哪里:

class DBStruct st => StructMem structTy valTy name | structTy name -> valTy where
    offset :: structTy -> valTy -> name -> Int64
Run Code Online (Sandbox Code Playgroud)

我有一些辅助函数,它们使用offset方法读取/写入结构元素,从存储的引用读取结构,以及延迟推迟结构读取(允许延迟读取整个文件).

这个问题是它需要大量重复才能使用.对于一个结构,我首先要定义Haskell类型:

data RowBlock = RowBlock {rbNext :: Maybe RowBlock
                         ,rbPrev :: Maybe RowBlock
                         ,rbRows :: [RowTy]
                         }
Run Code Online (Sandbox Code Playgroud)

那么name类型:

data Next = Next
data Prev = Prev
data Count = Count
newtype Row …
Run Code Online (Sandbox Code Playgroud)

haskell

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

使用QuickCheck测试故意错误情况

我已经看到QuickCheck如何用于测试monadic和非monadic代码,但是如何使用它来测试处理错误的代码,即打印一些消息然后调用exitWith

haskell quickcheck

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

参考元组初始化引用元组

如果我有代码

#include <tuple>

using Vec3 = std::tuple<float, float, float>;
using Vec3Ref = std::tuple<float&, float&, float&>;

void stuff ()
{
  Vec3 foo (0,0,0);
  Vec3Ref bar (foo);
}
Run Code Online (Sandbox Code Playgroud)

我收到错误

/usr/include/c++/4.6/tuple:100:4: error: binding of reference to type 'float' to
a value of type 'const float' drops qualifiers

: _M_head_impl(std::forward<_UHead>(__h)) { }

^ ~~~~~~~~~~~~~~~~~~~~~~~~~

//snip...

/usr/include/c++/4.6/tuple:257:11: note: in instantiation of function template
specialization 'std::_Tuple_impl<0, float &, float &, float &>::_Tuple_impl
<float, float, float>' requested here

: _Inherited(static_cast<const _Tuple_impl<0, _UElements...>&>(__in))

^

18 : note: in …
Run Code Online (Sandbox Code Playgroud)

c++ tuples reference

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

透明地将临时插入调用者的范围

在C++中,operator->具有特殊的语义,因为如果返回的类型不是指针,它将operator->再次调用该类型.但是,中间值通过调用表达式保持为临时值.这允许代码检测返回值的变化:

template<class T>
class wrapper
{
    // ...
    T val;

    struct arrow_helper
    {
        arrow_helper(const T& temp)
            : temp(temp){}
        T temp;
        T* operator->() { return &temp; }
        ~arrow_helper() { std::cout << "modified to " << temp << '\n'; }
    };

    arrow_helper operator->() { return{ val }; }
    //return const value to prevent mistakes
    const T operator*() const { return val; }
}
Run Code Online (Sandbox Code Playgroud)

然后T可以透明地访问其成员:

wrapper<Foo> f(/*...*/);
f->bar = 6;
Run Code Online (Sandbox Code Playgroud)

这样做会有什么问题吗?另外,有没有办法通过除以外的功能获得此效果operator->

编辑:我遇到的另一个问题是表达式

f->bar = f->bar …
Run Code Online (Sandbox Code Playgroud)

c++

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

'除了资源T'与'资源T除外'

真实世界Haskell表示"变压器堆叠顺序很重要".但是,我似乎无法弄清楚ExceptT (ResourceT m) a和之间是否存在差异ResourceT (ExceptT m) a.他们会互相干涉吗?

haskell monad-transformers

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

如果函数应用程序是类型类怎么办?

假设Haskell的函数应用程序("空格"运算符)在类型类中而不是烘焙到语言中.我想它会看起来像

class Apply f where
    ($) :: f a r -> a -> r

instance Apply (->) where
   ($) = builtinFnApply#
Run Code Online (Sandbox Code Playgroud)

并且f adesugar to f $ a.这个想法是,这可以让你定义其​​他类似函数的类型,即

instance Apply LinearMap where
    ($) = matrixVectorMult
Run Code Online (Sandbox Code Playgroud)

等等.

这会使类型推断变得不可判定吗?我的直觉说它确实存在,但我对类型推断的理解停留在简单的Hindley-Milner.作为后续行动,如果它不可判定的,可以通过禁止某些病态实例来判断它是否可以判定?

haskell type-inference

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