小编Shm*_*ine的帖子

-fPIC标志可以增加多少开销?

我正在测试一个计算Mandelbrot分形的简单代码.我一直在检查它的性能,具体取决于函数中的迭代次数,它检查一个点是否属于Mandelbrot集.令人惊讶的是,在添加-fPIC旗帜后,我的时间差异很大.从我读到的开销通常可以忽略不计,我遇到的最高开销约为6%.我大约30%.任何建议将被认真考虑!

我的项目详情

我使用-O3标志,gcc 4.7.2,Ubuntu 12.04.2,x86_64.结果如下

    #iter     C (fPIC)  C       C/C(fPIC)
    1         0.01      0.01    1.00 
    100       0.04      0.03    0.75 
    200       0.06      0.04    0.67 
    500       0.15      0.1     0.67 
    1000      0.28      0.19    0.68
    2000      0.56      0.37    0.66 
    4000      1.11      0.72    0.65 
    8000      2.21      1.47    0.67
   16000      4.42      2.88    0.65 
   32000      8.8       5.77    0.66 
   64000      17.6      11.53   0.66

我使用的命令:

gcc -O3 -fPIC fractalMain.c fractal.c -o ffpic
gcc -O3 fractalMain.c fractal.c -o f
Run Code Online (Sandbox Code Playgroud)

代码:fractalMain.c

#include <time.h>
#include <stdio.h>
#include <stdbool.h> …
Run Code Online (Sandbox Code Playgroud)

c performance gcc

27
推荐指数
2
解决办法
6217
查看次数

嵌套模板类的特化语法

我试图找出嵌套模板类的显式特化的正确语法.以下代码将更好地说明:

struct Column_Major;
struct Row_Major;

template<size_t rows, size_t cols, typename T, typename Allocator>
class Matrix
{

    /* bunch of members */
    template <typename storage = Column_Major>
    class Iterator
    {
        /* bunch of members */
    };
};
Run Code Online (Sandbox Code Playgroud)

我想写一个明确的专业化template <> class Matrix<...>::Iterator<Row_Major,但语法正在逃避我.我怀疑如果没有包含类Matrix的显式特化,就不可能明确地专门化Iterator类.但如果有办法,我会很高兴.

我知道我可以使Iterator类成为一个单独的类,而不是Matrix类的成员,但是让嵌套的类允许我完全访问Matrix类的模板参数和数据库,这简化了事情.我知道如果需要,我可以解决这个问题,但我首先想调查并了解嵌套方法的可能性.

谢谢,Shmuel

c++ templates inner-classes template-specialization

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

使用Eigen与Visual Studio 2013的动态库的内存对齐错误

我一直在我的软件中使用Eigen,今天我遇到了一个问题,因为使用Visual Studio 2013将我的代码从构建静态库更改为Windows中的动态库.此切换的原因与此无关艾根.

我将Eigen嵌入到我自己的库文件中,然后将其链接到我的应用程序中.如前所述,这个库直到今天仍然是一个静态库; 我刚刚更新了我的代码库以生成DLL文件.

自从进行此更改后,我现在从Visual Studio收到以下错误消息:

--------------------的块由对齐的例程分配,使用_aligned_free()

(此消息每次都会弹出多次不同的地址;我上面使用了破折号,因为我不相信特定地址与此问题相关).

选择"retry"会将调试器打开到Memory.h上的第255行

Visual Studio IntelliSense(未调试时)表明EIGEN_ALIGN和EIGEN_HAS_MM_MALLOC都定义为1,EIGEN_MALLOC_ALREADY_ALIGNED和EIGEN_HAS_POSIX_MEMALIGN都是未定义的.因此,它应该运行_mm_free(ptr),它(再次来自IntelliSense)是_aligned_free(a)的别名.因此,似乎此代码应该运行正确的函数,但事实并非如此.

当我将代码更改回静态库时,此问题就消失了.

我从众多谷歌搜索中发现的唯一远程相关的是来自英特尔Fortran编译器的一篇文章,该文章说这个错误消息可能来自一个库,该库是在早期版本中编译的,由最新版本编译的代码调用.除了我使用Visual Studio C++ 2013之外,我已经多次重建代码以确保它从干净状态完全重新编译并且此错误消息仍然存在.

我已从mercurial repo(默认分支)下载了最新代码,但这并没有解决问题.

我尽力做到尽善尽美.如果您需要更多信息,请告诉我.

编辑:

进一步背景:

在这种情况下使用DLL的"客户端代码"是Google Test; 测试期望后引发错误消息 - 即DLL文件中的类正在运行析构函数来清理临时对象.我不是试图做一些邪恶的事情,比如在DLL文件中分配内存,然后在驱动程序应用程序中取消分配 - 这部分是为什么我发现这是如此令人困惑....

c++ memory-management eigen visual-studio-2013

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

CMake项目中的组建目标

我只是使用add_custom_target()命令将doxygen生成包括在我的项目中。现在,我不包括全部,因为我不希望此构建为默认构建。

现在,我有以下情形。

项目/ subproj1 / doc项目/ subproj2 / doc

在每个子项目中,都有一个CMakeLists.txt文件,其中包含: add_custom_target(gen_doc_subproj1 ...) add_custom_target(gen_doc_subproj2 ...)

我想要实现的是生成生成文件后,我可以输入:

制作文档 ,它将建立所有文档目标。

CMake中是否有一些构造,例如: if_not_exist_target_group(doc) create_target_group(doc) endif add_to_target_group(gen_doc_subproj1, doc)

任何指针都会被应用。

cmake

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