我需要每秒运行240000次矩阵向量乘法.矩阵是5x5并且始终相同,而向量在每次迭代时都会发生变化.数据类型是float.我正在考虑使用一些SSE(或类似)指令.
1)我担心算术运算的数量与所涉及的存储器操作的数量相比太小.你认为我可以获得一些有形的(例如> 20%)改善吗?
2)我需要英特尔编译器吗?
3)你能指出一些参考文献吗?
谢谢大家!
在重写了存储库的历史记录之后git filter-branch,所有的SHA都会发生变化.
现在,如果该存储库(让我们称之为X)被用作另一个存储库中的git子模块(让我们调用它Y),我们就遇到了问题.
实际上,Y根据该子模块X中提交的SHA 知道要加载的子模块的版本.由于X现在所有的SHA 都已发生变化,因此Y指向不再存在的SHA.
有没有办法重写它的历史Y,它指向子模块的新提交SHA X(在当前和过去的提交中)?
我猜想,鉴于旧的SHA和新的SHA之间的对应关系,原则上这是可能的,但我担心它会涉及令人讨厌的bash脚本.
还有什么比这更容易了
重新分配变量时,不会调用析构函数:
Object foo = Object(a,b);
foo = Object(c,d);
Run Code Online (Sandbox Code Playgroud)
因此,析构函数只会在Object(c,d)范围的末尾被调用,这显然会导致问题.现在,在这种特殊情况下,它并没有太多困扰我:它足以声明2个不同的对象:
Object foo1 = Object(a,b);
Object foo2 = Object(c,d);
Run Code Online (Sandbox Code Playgroud)
这样,两个对象的析构函数将在最后被调用.
但是,有一种情况我必须重新分配变量,即在对象构造函数中,例如:
SuperObject(Point point1, Point point2) : delay_object_(DelayObject(0)) {
double distance = distance(point1, point2);
double delay = distance / speed;
delay_object_ = DelayObject(delay);
}
Run Code Online (Sandbox Code Playgroud)
事实上,DelayObject参数不容易计算(在这个例子中我也省略了一些其他段落),我想避免在初始化列表中这样做.
我以为我可以通过将对象放在堆中并显式调用析构函数来强制删除:
SuperObject(Point point1, Point point2) : p_delay_object_(new DelayObject(0)) {
double distance = distance(point1, point2);
double delay = distance / speed;
delete p_delay_object_;
p_delay_object_ = new DelayObject(delay);
}
Run Code Online (Sandbox Code Playgroud)
但这对我来说真的很难看,因为我更喜欢在严格必要的时候使用动态分配.我错过了什么吗?
干杯!
你知道一些实现IIR过滤器的C++库吗?我需要类似于Matlab的过滤器(B,A,X)功能.虽然没有必要,但我更倾向于实施IIR直接表格2.
我正在考虑在我的库中使用rangev3。我喜欢rangev3的语法,但优先考虑的是性能。该库运行许多矢量乘法和加法运算,大多数长度为128个样本。我使用Google基准来评估例如两个向量的相加。Ranges版本比STD版本慢得多(对于较短的向量长度,其速度几乎慢10倍)。这有些令人惊讶,因为通常声称rangev3(以及C ++ 20中将来的std :: ranges)具有良好的性能。
我在这里如何使用rangev3是否存在问题?还是与编译器无法很好地展开rangev3代码有关?还是仅对于许多菊花链式操作才会显示rangev3的性能提升?
注意:output = rng1;由于向量长度是相同的,因此分配不应分配内存(我尝试使用range :: copy,但是它变慢了100倍)。我试图对向量A和B进行预初始化和随机化,但没有发现任何区别。我确实注意到,如果我在管道中有更多操作,则STL和ragesv3之间的差距会缩小,但仅适用于长向量(5个连续操作高于32000)。
下面是一个包含性能指标的独立示例。我在带有-O3标志的4核i7 MacBook Pro上运行C ++ 17 LLVM libc ++。
#include <range/v3/all.hpp>
#include "benchmark.h"
static void AddBenchmark(benchmark::State& state) {
const size_t length = state.range(0);
std::vector<double> B(length);
std::vector<double> A(length);
std::vector<double> output(length);
while (state.KeepRunning()) {
std::transform(A.begin( ), A.end( ), B.begin( ), output.begin(), std::plus<>( ));
benchmark::ClobberMemory(); // Force output to be written to memory.
}
}
BENCHMARK(AddBenchmark)->RangeMultiplier(8)->Range(1<<7, 1<<20);
static void AddRangesBenchmark(benchmark::State& state) {
const size_t length = state.range(0);
std::vector<double> B(length);
std::vector<double> A(length); …Run Code Online (Sandbox Code Playgroud) 我的CentOs 5.5服务器上有一个正常运行的git存储库.我想使用gitweb为我的存储库提供Web用户界面.
我使用http://git-scm.com/book/ch4-6.html上的说明安装了gitweb ,我设法让我的apache服务器正确运行cgi.我将我的存储库放入/pub/git并使用该行创建了该gitweb.conf文件.不幸的是,我看不到我的存储库和网页显示消息"没有找到这样的项目",我用Google搜索没有成功./etc/$projectroot = '/pub/git';
我尝试将该行添加$projects_list = '/pub/git/projects.list';到该gitweb.conf文件中projects.list,并使用我的存储库名称创建该文件(例如repos1.git).没有什么变化.如果我把不存在的存储库的名称/pub/git,网页显示更受欢迎和调查的错误消息"404 - 没有找到项目".
请注意,apache用户可以访问所有文件和存储库.
我的内容/etc/gitweb.conf是:
$projectroot = '/pub/git';
$projects_list = '/pub/git/projects.list';
Run Code Online (Sandbox Code Playgroud)
谢谢!
我一直收到不赞成的标题警告:
#ifdef __DEPRECATED
#warning This file includes at least one deprecated or antiquated header. \
Please consider using one of the 32 headers found in section 17.4.1.2 of the \
C++ standard. Examples include substituting the <X> header for the <X.h> \
header for C++ includes, or <iostream> instead of the deprecated header \
<iostream.h>. To disable this warning use -Wno-deprecated.
#endif
Run Code Online (Sandbox Code Playgroud)
但是,我没有看到我的项目调用的任何已弃用的标头(包括我的库调用的标头).这些都是我加载头(或者,至少,我看到的): iostream math.h assert.h fstream vector time.h.
在第17.4.1.2节http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf中,只有一个应该使用的标题列表.
1)是否有某个已弃用的列表?
2)关于如何离开预处理器的想法哪一个是他不喜欢的精确标题?
干杯!
c++ ×5
git ×2
deprecated ×1
destructor ×1
filter ×1
gitweb ×1
header ×1
range-v3 ×1
sse ×1
vector ×1