小编Tho*_*mas的帖子

Variadic模板和switch语句?

我有以下函数,可以采用不同类型的N个参数,并以这种方式将它们转发到每个单独类型模板化的N个函数(带有两个参数的示例):

template <typename T1, typename T2>
bool func(int& counter, T1 x1, T2 x2) {
    switch (counter) {
        case 0:
            if (func2<T1>(x1)) {
                counter++;
                return true;
            } else {
                return false;
            }
        case 1:
            if (func2<T2>(x2)) {
                counter++;
                return true;
            } else {
                return false;
            }
        default:
            return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想用可变参数模板编写这个函数,以便它可以以类型安全的方式处理任意数量的参数.我可以看到一个使用递归函数的解决方案,传递计数器和可变参数索引并比较它们的相等性,但这似乎产生的效率远远低于上面的switch语句(if-checks序列与跳转表相比) ).

这可以使用模板元编程有效地完成,还是我需要为每个arity提供重载?

c++ templates template-meta-programming variadic-templates c++14

19
推荐指数
1
解决办法
1929
查看次数

启用优化的奇怪行为

我有这个小代码片段(这是我遇到的问题的最小工作示例):

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

void xorBuffer(unsigned char* dst, unsigned char* src, int len)
{
    while (len != 0)
    {
        *dst ^= *src;
        dst++;
        src++;
        len--;
    }
}

int main()
{
    unsigned char* a = malloc(32);
    unsigned char* b = malloc(32);
    int t;

    memset(a, 0xAA, 32);
    memset(b, 0xBB, 32);

    xorBuffer(a, b, 32);

    printf("result = ");
    for (t = 0; t < 32; t++) printf("%.2x", a[t]);
    printf("\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码应该执行两个32字节的内存缓冲区(概念上,应该这样做a = a ^ b).由于0xAA ^ 0xBB …

c debugging gcc

17
推荐指数
2
解决办法
607
查看次数

OpenCL设备的唯一性

有没有办法让OpenCL给我一个列出所有具有OpenCL实现的独特物理设备?我知道如何遍历平台/设备列表但是,例如,在我的情况下,我有一个英特尔提供的平台,它为我的CPU提供了高效的设备实现,以及为我的GPU提供快速实现的APP平台但是我的CPU可怕的实现.

有没有办法解决这两个CPU设备实际上是同一个物理设备,这样我就可以选择最有效的设备并使用它,而不是同时使用它们并让它们相互竞争计算时间单个物理设备?

我已经看过CL_DEVICE_VENDOR_IDCL_DEVICE_NAME,但他们不解决我的问题上,CL_DEVICE_NAME将是同一型号的两个单独的物理设备一样(双GPU的),并CL_DEVICE_VENDOR_ID给了我一个不同的ID为根据不同的平台上我的CPU.

一个理想的解决方案是某种独特的物理设备ID,但我很乐意手动更改OpenCL配置以自行重新排列设备(如果可能的话).

opencl

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

gcc内在的扩展除法/乘法

现代CPU可以在两个原生大小的字之间执行扩展乘法,并将低和高结果存储在单独的寄存器中.类似地,当执行除法时,它们将商和余数存储在两个不同的寄存器中,而不是丢弃不需要的部分.

是否存在某种可移植的gcc内在函数,它将采用以下签名:

void extmul(size_t a, size_t b, size_t *lo, size_t *hi);
Run Code Online (Sandbox Code Playgroud)

或类似的东西,以及分裂:

void extdiv(size_t a, size_t b, size_t *q, size_t *r);
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过在代码中抛出#ifdef来使用内联汇编和shoehorn可移植性来实现它,或者我可以使用部分和来模拟乘法部分(这将显着更慢)但我想避免这样做以便于阅读.当然有一些内置函数可以做到这一点?

c gcc

12
推荐指数
2
解决办法
5103
查看次数

从依赖关系图中排除特定标头

我不确定这是一个doxygen还是一个dot问题,但是这里有.

在项目中,我需要包括常见的头这么多的文件stdlib.h,stdint.h等.当我要求doxygen为我的每个文件生成依赖图时,这会导致很多混乱和噪音,因为绘图工具总是重用现有节点并且从不复制它们.

我可以以某种方式告诉doxygen从生成的图形中排除一组标题,完全忽略它们吗?在构建文档时,我宁愿不使用可怕的预处理器技巧来删除#include.

我找到了一些人问同一个事情的邮件列表线程,但他们要么没有得到回复,也没有关于玩依赖图最大深度的建议,这根本不起作用,因为标题可以包含在任何深度(这样做)最终咀嚼我自己的本地标题).

doxygen dot

10
推荐指数
1
解决办法
1318
查看次数

Python中多处理或多线程的动态刷新打印

我已经实现了一个多处理下载器.如何打印可在终端的不同部分自动刷新的状态栏(完整速率,下载速度).

像这样:

    499712  [6.79%]   68k/s     // keep refreshing
    122712  [16.79%]   42k/s    // different process/thread
     99712  [56.32%]   10k/s
Run Code Online (Sandbox Code Playgroud)

码:

download(...)
...
    f = open(tmp_file_path, 'wb')
    print "Downloading: %s Bytes: %s" % (self.file_name, self.file_size)
    file_size_dl = 0
    block_sz = 8192
    start_time = time.time()
    while True:
        buffer = self.opening.read(block_sz)
        if not buffer:
            break

        file_size_dl += len(buffer)
        f.write(buffer)
        end_time = time.time()
        cost_time = end_time - start_time
        if cost_time == 0:
            cost_time = 1
        status = "\r%10d  [%3.2f%%]  %3dk/s" % (file_size_dl,
                file_size_dl * 100. / …
Run Code Online (Sandbox Code Playgroud)

python multithreading download

8
推荐指数
1
解决办法
3666
查看次数

推送到浮点寄存器而不是堆栈

我有一个需要尽可能快的函数,它只使用整数运算.它运行在AMD64架构上,我需要做一些推/弹,以便有足够的寄存器来使用.现在我想知道,x64 ABI声明前四个浮点寄存器(XMM0,XMM1,XMM2和XMM3)是易失性的,不需要在函数调用之间保留.

所以我想我可以通过movq(MMX或SSE指令集)而不是使用堆栈来保存我需要保存在这些寄存器的低64位(即MM0,MM1,...)中的64位寄存器,从而节省了自己的工作.一些内存加载/存储.此外,我不需要使用EMMS来存储FPU状态 - 这会破坏目的 - 因为我实际上并没有操纵浮点寄存器而只是使用它们作为存储(而且无论如何,x87单元根本不使用x64,因为它基本上被SSE取代)

我已经做了修改并且它可以工作(没有崩溃,并且可观察到性能提高了4%),但是我想知道,这个"黑客"真的有用吗还是会引入我可能错过的任何特殊副作用(比如FPU状态)腐败,即使我不使用它,那种事情).加载/存储到FPU寄存器总是比任何当前架构上的内存加载/存储更快?

而且,是的,真的需要这种优化.公平地说,这不会严重降低代码维护成本,单行评论就足以解释这个伎俩.因此,如果我可以免费获得每个字节少的时钟而不会产生意想不到的后果,我很乐意接受它们:)

谢谢.

assembly cpu-registers

6
推荐指数
1
解决办法
997
查看次数

Java泛型,列表列表

这件事让我难过.我有一个课程如下:

public class SpecialList implements List<MyType> {
    // overriden methods
}
Run Code Online (Sandbox Code Playgroud)

现在我有以下方法合同要尊重更高级别:

public class MyClass {
    private List<SpecialList> bigList = new ArrayList<SpecialList>();

    public void doStuff(List<MyType> list)
    {
        bigList.add((SpecialList)list); // does not compile - invalid cast
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的不确定我在这里做错了什么.我有一个实现List<MyType>接口的类,但我不能将该类转换为List<MyType>?这对我没有任何意义.

我搞不清楚了.我应该做些什么来完成这项工作?我想这与泛型协方差有关,但此时我不知道这里有什么问题.有人能指出正确的方向吗?谢谢.

java generics

6
推荐指数
1
解决办法
1584
查看次数

依赖的Makefile字符串替换不起作用

我有一个文件夹结构,我的所有源文件都在./src/中,我的所有目标文件都在./obj/中(具有相同的内部目录结构,使用路径替换进行镜像).我创建了以下makefile:

$(EXECUTABLE): $(OBJECTS)
    @echo Linking $(EXECUTABLE)...
    $(CXX) $(LDLIBS) $(OBJECTS) -o $(EXECUTABLE)

%.o: $(subst o,cpp,$(subst obj/,src/,$@))
    @echo Building $@...
    $(CXX) $(CPPFLAGS) -c $(subst o,cpp,$(subst obj/,src/,$@)) -o $@
Run Code Online (Sandbox Code Playgroud)

哪个不行!Make一直声称目标文件是最新的,即使源文件实际上比目标文件旧.另一方面,如果我这样做:

obj/main.o: src/main.cpp
    @echo Building $@...
    $(CXX) $(CPPFLAGS) -c src/main.cpp -o $@
Run Code Online (Sandbox Code Playgroud)

对于每个源文件,它都可以完美运行.我检查了,两个subst给出了相同的结果(obj/main.o成为src/main.cpp,如预期的那样).然而,由于某种原因,Make不接受依赖.

这给了我很多的悲伤,有人可以解释我哪里出错了吗?我不明白发生了什么,我认为我的替换会起作用,因为它给出了相同的输出.我不被允许使用subst,或者$@依赖于什么?

makefile

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

捕获 lambda 中对齐的变量时出现分段错误

这个小代码片段与 g++ 6.2.0 和 clang++ 3.8.1 的段错误:

clang++ -std=c++11 -O3 -mavx -pthread 或者 g++ -std=c++11 -O3 -mavx -pthread

#include <thread>
#include <iostream>

class alignas(32) AlignedObject {
public:
  float dummy[8];
};

int main() {
  while (true) {
    std::thread([](){
      AlignedObject x;
      std::cout << &x;
      std::thread([x](){
        std::cout << &x;
      }).join();
    }).join();
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

查看反汇编,两个编译器都插入vmovaps了失败的指令,这表明某处编译器生成的对象没有正确对齐。-mavx由于不再使用该指令,因此删除它可以正常工作。这是编译器错误还是该代码依赖于未定义的行为?

c++ lambda memory-alignment avx c++11

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