小编Phi*_*rad的帖子

LAPACK/BLAS与简单的"for"循环

我想将一段涉及大量向量和矩阵计算的代码迁移到C或C++,目标是尽可能地加速代码.

forC代码中的循环线性代数计算与使用LAPACK/BLAS的计算一样快,或者使用这些库有一些独特的加速?

换句话说,简单的C代码(使用for循环等)可以像利用LAPACK/BLAS的代码一样快地执行线性代数计算吗?

c c++ performance blas lapack

8
推荐指数
2
解决办法
5614
查看次数

应用程序崩溃,但没有生成核心转储

我有一个问题,我的应用程序在几天/几周后继续倾销核心,但不幸的是,没有产生核心转储.

我们试图设置ulimit -c unlimited没有成功,所以我们setrlimit在代码本身中包含了功能,但也没有运气.最重要的是,我们也添加了MALLOC_CHECK_.

有趣的是,当我们尝试启动手动核心转储(使用kill -ABRT <pid>)时,它确实生成了核心转储.

我可以看到以下消息 /var/log/message

内核:[2302077.396021] myapp [22140]:segfault at 54552e42 ip 00000000f773f36f sp 00000000fffdc48c error 4 in ld-2.11.3.so [f7727000 + 1f000]

环境:sles11

有关如何使应用程序更可靠地生成核心转储的任何建议?

c linux gdb suse opensuse

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

Qt调用外部Python脚本

我正在尝试为我用Python编写的命令行工具编写一个GUI包装器.
有人建议我应该使用Qt.

下面是我的项目的.cpp文件:

#include "v_1.h"
#include "ui_v_1.h"
#include<QtCore/QFile>
#include<QtCore/QTextStream>
#include <QProcess>
#include <QPushButton>
v_1::v_1(QWidget *parent) :
    QMainWindow(parent),ui(new Ui::v_1)
    {
        ui->setupUi(this);
    }
    v_1::~v_1()
    {
        delete ui;
    }

void v_1::on_pushButton_clicked()
{
    QProcess p;
    p.start("python script -arg1 arg1");
    p.waitForFinished(-1);
    QString p_stdout = p.readAllStandardOutput();
    ui->lineEdit->setText(p_stdout);
}
Run Code Online (Sandbox Code Playgroud)

下面是我的项目的头文件:

#ifndef V_1_H
#define V_1_H
#include <QMainWindow>
namespace Ui {
class v_1;
}

class v_1 : public QMainWindow
{
    Q_OBJECT   
public:
    explicit v_1(QWidget *parent = 0);
    ~v_1();

private slots:
    void on_pushButton_clicked();
private:
    Ui::v_1 *ui;
};

#endif // V_1_H …
Run Code Online (Sandbox Code Playgroud)

c++ qt qt4 qprocess

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

联盟可以在 C 中自引用吗?

我在一次采访中被问到“联盟可以自我引用吗?”

我知道struct可以自我参考,但我真的很困惑union。我在一本教科书中读到 union 可以自我引用,但它没有对这个主题进行更多说明。

任何人都可以确认是否union 能够自我引用?

c unions

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

指针间接是否比条件更昂贵?

指针间接(获取值)是否比条件更昂贵?

我观察到大多数不错的编译器可以在不同程度上预先计算指针间接 - 可能会删除大多数分支指令 - 但我感兴趣的是间接成本是否高于分支点的成本.生成的代码.

我希望如果指针引用的数据在运行时不在缓存中,可能会发生缓存刷新,但我没有任何数据可以支持.

有没有人对这个问题有可靠的数据(或合理的意见)?


编辑:几张海报指出,分支成本没有"一般情况":芯片之间的差异很大.

如果您碰巧知道一个值得注意的案例,其中分支将比缓存间接更便宜(有或没有分支预测),请提及它.

c performance conditional pointers

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

使用联合和函数指针在 C 中实现函数委托

我希望能够将一个函数一般地传递​​给C 中的一个函数。我已经使用 C 几年了,我知道实现正确的闭包和高阶函数的障碍。这几乎是不可逾越的。

我搜索了 StackOverflow 以查看其他消息来源对此事的看法:

...除了使用可变参数或程序集之外,没有人有一个银弹一般的答案。我没有汇编的骨头,但如果我能在宿主语言中有效地实现一个特性,我通常会尝试。

因为我不能轻易拥有 HOF...

我喜欢高阶函数,但我会在紧要关头满足于委托。我怀疑通过类似下面的代码,我可以在 C 中获得一个可行的委托实现

想到了这样的实现:

enum FUN_TYPES {
    GENERIC,
    VOID_FUN,
    INT_FUN,
    UINT32_FUN,
    FLOAT_FUN,
};

typedef struct delegate {
    uint32 fun_type;
    union function {
        int (*int_fun)(int);
        uint32 (*uint_fun)(uint);
        float (*float_fun)(float);
        /* ... etc. until all basic types/structs in the 
           program are accounted for. */
    } function;
} delegate; …
Run Code Online (Sandbox Code Playgroud)

c delegates function-pointers anonymous-function unions

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

什么类型的语言被PDA接受,其中堆栈大小有限?

什么类型的语言被PDA接受,其中堆栈大小限制为20项?

在我看来它应该仍然是CFL,因为有一个临时存储器存储.

automata state-machine pushdown-automaton automata-theory

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

为数字提供安全的gcc优化选项

哪些gcc编译器选项可以安全地用于数值编程?

打开gcc优化的简单方法是添加-0#到编译器选项.很有诱惑力-O3.但是,我知道-O3包括优化,这是非保存的,因为一旦包含此选项,数值计算的结果可能会有所不同.如果算法稳定,结果的微小变化可能是微不足道的.另一方面,精度可能是某些数学运算的问题,因此数学优化会产生重大影响.

我发现在调试过程中考虑编译器相关问题是不方便的.即我不想知道代码中的微小变化是否会导致强烈不同的行为,因为编译器在内部更改了它的优化.

如果我想在我的代码中使用确定性(因此可控制)行为,哪些选项可以安全添加?这几乎是安全的,也就是说,哪些选项与性能优势相比只会产生微小的不确定性?

我想到了这样的选项:-finline -finline-limit=2000即使它们很长,也会内联函数.

c compiler-construction optimization gcc numeric

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

在C程序中,收到警告:"声明无效"

当我尝试编译特定程序时-Wall,GCC显示警告:

expcal.c:66:5: warning: statement with no effect [-Wunused-value]
Run Code Online (Sandbox Code Playgroud)

这个警告是指线:

ed.operator[j] == str[i];
Run Code Online (Sandbox Code Playgroud)

在以下循环中找到:

for(i=0;i<strlen(str);i++)
        {
                j=0;
                if(str[i] == '+' || str[i] == '-' || str[i] == '*')
                {
                        if(str[i+1] == '+' || str[i+1] == '-' || str[i+1] == '*')
                                return 0;
                        else
                        {
                                //j=0;
                                ed.operator[j] == str[i];
                                count++;
                                j++;
                        }
                }
        }
Run Code Online (Sandbox Code Playgroud)

我知道当一个赋值语句出现问题时会出现这个警告.上面的代码有什么问题会导致GCC产生这样的警告?

c for-loop segmentation-fault gcc-warning

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

每次调用父函数时,是否重新分配C中的静态变量?

假设我在C中的函数内声明了一个静态变量.

如果我多次调用该函数,那么每次调用函数时是否会在内存中重新分配静态变量?

如果确实重新分配,为什么始终保持最后一个值?

例:

void add()
{
    static int x = 1;
    x++;
    printf("%d\n",x);
}

int main()
{
    add(); // return 2
    add(); // return 3
    add(); // return 4
}
Run Code Online (Sandbox Code Playgroud)

c variables static

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