小编Mys*_*ial的帖子

C++中双减法的优化

我有以下代码用于计算两个向量之间的距离:

double dist(vector<double> & vecA, vector<double> & vecB){
    double curDist = 0.0;
    for (size_t i = 0; i < vecA.size(); i++){
        double dif = vecA[i] - vecB[i];
        curDist += dif * dif;
    }

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

此功能是我应用程序中的主要瓶颈,因为它依赖于大量距离计算,在典型输入上占用超过60%的CPU时间.另外,以下行:

double dif = vecA[i] - vecB[i];
Run Code Online (Sandbox Code Playgroud)

在此功能中负责超过77%的CPU时间.我的问题是:是否有可能以某种方式优化此功能?

笔记:

  • 为了描述我的应用,我使用了Intel Amplifier XE;
  • 减少距离计算的数量对我来说不是一个可行的解决方案;

c++ optimization performance

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

什么是无限迭代器?为什么要用它?

我试图理解我必须在作业中回答的以下问题.它询问无限迭代器.他们会在哪里有用?我认为迭代器用于遍历集合,如:

Iterator itr = ArrayList.iterator();
while (itr.hasNext())
{
    System.out.println(itr.next());
}
Run Code Online (Sandbox Code Playgroud)

一旦itr到达集合的末尾,就完成了,只要在迭代过程中不必进行其他操作.那么为什么甚至打扰无限的迭代器呢?

java iterator arraylist data-structures

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

LLVM中的别名分析

我试图找到存储指令的指针操作数和函数参数之间的别名.这是代码,

virtual void getAnalysisUsage(AnalysisUsage &AU) const {

    AU.addRequiredTransitive<AliasAnalysis>();
    AU.addPreserved<AliasAnalysis>();
}

virtual bool runOnFunction(Function &F) {

    AliasAnalysis &AA = getAnalysis<AliasAnalysis>();

    for(Function::iterator i=F.begin();i!=F.end();++i){
        for(BasicBlock::iterator j=i->begin();j!=i->end();++j)
        {
            if(dyn_cast<StoreInst>(j)){
                const StoreInst *SI=dyn_cast<StoreInst>(j);

                AliasAnalysis::Location LocA = AA.getLocation(SI);

                const Value *si_v= SI->getPointerOperand();

                for(Function::arg_iterator k=F.arg_begin(); k!=F.arg_end();++k)
                {
                    Value *v=dyn_cast<Value>(k);

                    AliasAnalysis::Location loc=AliasAnalysis::Location(v);
                    AliasAnalysis::AliasResult ar=AA.alias(LocA,loc);

                    switch(ar)
                    {
                    case 0:errs()<<  "NoAlias\n";
                    break;
                    ///< No dependencies.
                    case 1:errs()<<"MayAlias\n";    ///< Anything goes
                    break;
                    case 2: errs()<<"PartialAlias\n";///< Pointers differ, but pointees overlap.
                    break;

                    case 3: errs()<<"MustAlias\n";
                    }
               }
   }

   return true;
}
}; …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction llvm

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

在Java中将int []数组转换为short []数组

我有一个int数组,我已经为100个元素分配了空间.还有另一个阵列inShort[].我怎样才能转换inInt[]inShort[]

是否有必要分配新的内存,inShort[]或者有一种方法可以投射到inInt[]

int inInt[] = new int[100];
short inShort[];
Run Code Online (Sandbox Code Playgroud)

java arrays

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

指向不同地址的vTables和函数指针

我最近在bitsquid博客上阅读了一篇关于如何管理内存的文章,作者开始讨论vtable以及编译器如何将类添加到类中.这是该文章的链接.因为我几乎不知道关于这个问题的事情,所以我开始在网上寻找解释.我来到了这个链接.根据我读到的内容,我制作了以下代码:

char cache[24];

printf("Size of int = %d\n", sizeof(int));
printf("Size of A = %d\n", sizeof(A));

A* a = new(cache)A(0,0);
printf("%s\n",cache);
printf("vTable    : %d\n",*((int*)cache));
printf("cache addr: %d\n",&cache);

int* funcPointer = (int*)(*((int*)cache));
printf("A::sayHello: %d\n",&A::sayHello);
printf("funcPointer: %d\n",*funcPointer);
Run Code Online (Sandbox Code Playgroud)

A是一个具有两个整数成员和一个虚函数的类sayHello().

编辑:这是类定义:

class A {
public:
    int _x;
    int _y;
public:
    A(int x, int y) : _x(x), _y(y){ }
    virtual void sayHello() { printf("Hello You!"); }
};
Run Code Online (Sandbox Code Playgroud)

基本上我试图做的是看看vtable中的指针是否指向与我所从的地址相同的位置&A::sayHello,但问题是当我运行程序时,vtable中指针内的地址和sayHello()地址总是有区别的295.有谁知道为什么会发生这种情况?是否有某种标题被添加,我错过了?我在64位机器上运行visual studio express 2008.

从我调试的地址返回的 …

c++ memory-management vtable

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

C++ - 最快的整数类型?

我正在对算法进行基准测试,没有必要知道细节.主要组件是缓冲区(整数的原始数组)和索引器(整数 - 用于访问缓冲区中的元素).

缓冲区的最快类型似乎是unsigned char,以及short,int,long的有符号和无符号版本.但是char/signed char更慢.差异:1.07倍.

对于索引器,有符号和无符号类型之间没有区别.然而,int和long比char和short快1.21倍.

在考虑性能而不是内存消耗时,是否应该默认使用某种类型?

注意:缓冲区元素和索引器上使用的操作是赋值,递增,递减和比较.

c++ performance

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

什么时候CPU的舍入模式可以改变?

在一些文章中,他们建议使用fistp指令以快速方式转换float-> integer.这取决于CPU的当前舍入模式,因此您必须进行设置.

但是这个舍入模式是否可以在程序运行期间被其他程序更改?通过操作系统?

更糟糕的是,这是一种可能的情况(伪代码)吗?

set_rounding_mode(ROUND_TRUNCATE);
/* process gets switched out and other process sets the rounding mode to round */
int x = round_with_fistp(0.6);
printf("%d\n", x); // prints 1
Run Code Online (Sandbox Code Playgroud)

c floating-point x86 context-switch

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

计算pi的数字

我已经使用GMP库和C++来编写Gauss-Legendre算法的实现来计算pi的数字.

它有正确的输出,但问题是我不知道输出"变坏",因为我必须在代码中指定精度.

以下是使用64位精度的输出:3.141592653589793238*35*,后两位数字不正确.

我的问题是,如果我想ň pi的数字,有多少精度比特b,多少算法的迭代将需要?

谢谢

c++ floating-point pi gmp arbitrary-precision

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

streambuf得到streampos

我将C++ streambuf类用于编译器项目,并且需要一种方便的方法来获取流中的当前位置.

有两个成员函数,streambuf::pubseekpos和一个streambuf::pubseekoff,来修改位置,我很困惑没有streambuf::pubgetpos成员函数(或类似的东西)来阅读它.

似乎有两种可能的解决方法:

  1. 我可以将当​​前位置保存在单独的变量中,并在每次从流中读取字符时手动修改它.

  2. 我可以调用streambuf::pubseekoff(0, ios_base::cur),返回新的流位置.

对于这样一个微不足道的任务,第二种选择似乎是可用的,但是效率低下且不美观.有没有更好的方法呢?

c++ stl stream streambuf

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

将数据放入SIMD寄存器需要多少个周期?

我是学习x86和ARM架构的学生.

我想知道将多个数据放入SIMD寄存器需要多少个周期?

据我所知,x86 SSE的xmms寄存器具有128位大小的寄存器.

如果我想通过SIMD指令集和汇编语言将32位8位数据从堆栈中放入xmms寄存器中,

对于通用寄存器的PUSH/POP,它具有相同的循环时间吗?

或者每8位数据需要32倍的时间吗?

感谢您的关注和关注!

x86 sse simd

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