Nis*_*rak 5 c++ parallel-processing gcc stl libstdc++
我正在进行一些研究,并希望编辑libstdc ++库中的一些源代码进行实验.具体而言,我对试验并行排序算法感兴趣.有没有一个地方我可以找到文档来轻松编辑和构建源代码?
我试过构建各种版本的libstdc ++库,但没有成功.似乎大多数新版本都需要构建整个gcc包,这是一个更漫长的过程,特别是如果我要编辑和试验libstdc ++中的一些文件.
我也一直无法找到包含并行排序算法的源文件.我似乎只能找到定义函数的头文件,而不是源代码本身.任何建议或文档链接将不胜感激.
是的,您必须构建整个 GCC,但是一旦完成,您只需要重新构建 libstdc++ 部分。
在http://gcc.gnu.org/wiki/InstallingGCC 中描述了构建 GCC
libstdc++ 源代码在libstdc++-v3目录中。并行算法在 中libstdc++-v3/include/parallel,它们是模板,因此所有代码都在标题中。少量非标头代码在libstdc++-v3/src/c++98/parallel-settings.cc
要从顶级构建目录重建 libstdc++,请进入$TARGET/libstdc++-v3目录($TARGET类似于x86_64-unknown-linux-gnu)并运行make.
最小的分步示例
从源代码编译 GCC。精简命令:
sudo apt-get build-dep gcc
git clone git://gcc.gnu.org/git/gcc.git
cd gcc
git checkout gcc-6_4_0-release
./contrib/download_prerequisites
mkdir build
cd build
../configure --enable-languages=c,c++ --prefix="$(pwd)/install"
make -j`nproc`
Run Code Online (Sandbox Code Playgroud)
等待 30 分钟到两个小时。现在让我们使用这个测试程序a.cpp:
#include <cassert>
#include <queue>
int main() {
std::priority_queue<int> q;
q.emplace(2);
q.emplace(1);
q.emplace(3);
assert(q.top() == 3);
q.pop();
assert(q.top() == 2);
q.pop();
assert(q.top() == 1);
q.pop();
}
Run Code Online (Sandbox Code Playgroud)
首先编译并运行它以确保初始编译有效:
gcc/build/install/bin/g++ -g -std=c++11 -O0 -o a.out ./a.cpp
./a.out
Run Code Online (Sandbox Code Playgroud)
现在让我们修改priority_queue构造函数。
首先,您可以使用 GDB 轻松找到实际的构造函数,如下所述:何时应使用 make_heap 与优先队列?
所以我们用这个补丁来破解它:
diff --git a/libstdc++-v3/include/bits/stl_queue.h b/libstdc++-v3/include/bits/stl_queue.h
index 5d255e7300b..deec7bc4d99 100644
--- a/libstdc++-v3/include/bits/stl_queue.h
+++ b/libstdc++-v3/include/bits/stl_queue.h
@@ -61,6 +61,7 @@
#if __cplusplus >= 201103L
# include <bits/uses_allocator.h>
#endif
+#include <iostream>
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -444,7 +445,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
priority_queue(const _Compare& __x = _Compare(),
_Sequence&& __s = _Sequence())
: c(std::move(__s)), comp(__x)
- { std::make_heap(c.begin(), c.end(), comp); }
+ {
+ std::cout << "hacked" << std::endl;
+ std::make_heap(c.begin(), c.end(), comp);
+ }
template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
explicit
Run Code Online (Sandbox Code Playgroud)
然后重建并重新安装 libstdc++ 以节省大量时间:
cd gcc/build/x86_64-pc-linux-gnu/libstdc++-v3
make -j`nproc`
make install
Run Code Online (Sandbox Code Playgroud)
现在下一个构建并运行:
gcc/build/install/bin/g++ -g -std=c++11 -O0 -o a.out ./a.cpp
./a.out
Run Code Online (Sandbox Code Playgroud)
输出:
hacked
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 16.04 上测试。
glibc
作为奖励,如果您也对 C:单个主机上的多个 glibc 库感兴趣
| 归档时间: |
|
| 查看次数: |
3521 次 |
| 最近记录: |