我想将一段涉及大量向量和矩阵计算的代码迁移到C或C++,目标是尽可能地加速代码.
forC代码中的循环线性代数计算与使用LAPACK/BLAS的计算一样快,或者使用这些库有一些独特的加速?
换句话说,简单的C代码(使用for循环等)可以像利用LAPACK/BLAS的代码一样快地执行线性代数计算吗?
我有一个问题,我的应用程序在几天/几周后继续倾销核心,但不幸的是,没有产生核心转储.
我们试图设置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
有关如何使应用程序更可靠地生成核心转储的任何建议?
我正在尝试为我用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) 我在一次采访中被问到“联盟可以自我引用吗?”
我知道struct可以自我参考,但我真的很困惑union。我在一本教科书中读到 union 可以自我引用,但它没有对这个主题进行更多说明。
任何人都可以确认是否union 是或不能够自我引用?
我观察到大多数不错的编译器可以在不同程度上预先计算指针间接 - 可能会删除大多数分支指令 - 但我感兴趣的是间接成本是否高于分支点的成本.生成的代码.
我希望如果指针引用的数据在运行时不在缓存中,可能会发生缓存刷新,但我没有任何数据可以支持.
有没有人对这个问题有可靠的数据(或合理的意见)?
编辑:几张海报指出,分支成本没有"一般情况":芯片之间的差异很大.
如果您碰巧知道一个值得注意的案例,其中分支将比缓存间接更便宜(有或没有分支预测),请提及它.
我希望能够将一个函数一般地传递给C 中的一个函数。我已经使用 C 几年了,我知道实现正确的闭包和高阶函数的障碍。这几乎是不可逾越的。
我搜索了 StackOverflow 以查看其他消息来源对此事的看法:
...除了使用可变参数或程序集之外,没有人有一个银弹一般的答案。我没有汇编的骨头,但如果我能在宿主语言中有效地实现一个特性,我通常会尝试。
我喜欢高阶函数,但我会在紧要关头满足于委托。我怀疑通过类似下面的代码,我可以在 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) 打开gcc优化的简单方法是添加-0#到编译器选项.很有诱惑力-O3.但是,我知道-O3包括优化,这是非保存的,因为一旦包含此选项,数值计算的结果可能会有所不同.如果算法稳定,结果的微小变化可能是微不足道的.另一方面,精度可能是某些数学运算的问题,因此数学优化会产生重大影响.
我发现在调试过程中考虑编译器相关问题是不方便的.即我不想知道代码中的微小变化是否会导致强烈不同的行为,因为编译器在内部更改了它的优化.
如果我想在我的代码中使用确定性(因此可控制)行为,哪些选项可以安全添加?这几乎是安全的,也就是说,哪些选项与性能优势相比只会产生微小的不确定性?
我想到了这样的选项:-finline -finline-limit=2000即使它们很长,也会内联函数.
当我尝试编译特定程序时-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中的函数内声明了一个静态变量.
如果我多次调用该函数,那么每次调用函数时是否会在内存中重新分配静态变量?
如果确实重新分配,为什么始终保持最后一个值?
例:
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)