我正在研究一个数学问题,它具有能够"预先计算"大约一半问题的优点,将这些信息保存到文件中,然后多次重复使用它来计算我的问题的各种"实例".困难在于上传所有这些信息以解决实际问题是一个主要的瓶颈.
更具体地说:我可以预先计算大量的信息 - 大量的概率(long double),大量的std::map<int,int>,以及更多 - 并将所有这些东西保存到磁盘(几个Gb).
我计划下半年接受输入参数d.对于每个D,我需要执行大量计算,这些计算涉及预先计算的数据(来自文件)和特定于D的一些其他数据的组合(因此每个D的问题都不同).
有时我需要从文件中挑选出某些预先计算好的信息.其他时候,我需要从(大)文件上传每一段数据.
是否有任何使IO更快的策略?
boost::mpi由于其他原因,我已经将程序并行化(MPI,via ),但无论如何,访问磁盘上的文件会使我的计算时间无法忍受.
任何策略或优化?
目前我正在做所有事情cstdio,即没有iostream.那会有很大的不同吗?
假设我需要从磁盘上保存的同一文件中读取许多不同的独立数据块.
可以多线程上传这个吗?
相关:同一处理器上的所有线程是否使用相同的IO设备从磁盘读取?在这种情况下,多线程根本不会加速上传 - 线程只是排队等候.
(我目前正在使用OpenMP进行多线程处理.)
任何人都可以推荐任何包含维护各种浮点运算稳定性的策略的C++库/例程/包吗?
示例:假设您希望long double在单位间隔(0,1)中对一百万个向量/数组求和,并且每个数字的大小大致相同.天真的求和for (int i=0;i<1000000;++i) sum += array[i]; 是不可靠的 - 足够大i,sum将会比一个更大的数量级array[i],因此sum += array[i]相当于sum += 0.00.(注意:此示例的解决方案是二进制求和策略.)
我处理数千/数百万微小概率的总和和产品.我使用MPFRC++具有2048位有效数的任意精度库,但仍然适用相同的问题.
我主要关心的是:
在每第N次出现分隔符后,是否存在将文本文件拆分为多个块/块的单行内容?
示例:下面的分隔符是"+"
entry 1
some more
+
entry 2
some more
even more
+
entry 3
some more
+
entry 4
some more
+
...
Run Code Online (Sandbox Code Playgroud)
有几百万个条目,因此每次出现分隔符"+"时都要分开是一个坏主意.我想分开,例如,每隔50,000个分隔符"+"实例.
Unix命令"split"和"csplit"似乎没有这样做......
目标:
test为共享库创建可执行文件.问题
MYLIB.so似乎编译得很好.(没问题)../libMYLIB.so: undefined reference to __cudaRegisterLinkedBinary_39_tmpxft_000018cf_00000000_6_MYLIB_cpp1_ii_74c599a1
简化的makefile:
libMYlib.so : MYLIB.o
g++ -shared -Wl,-soname,libMYLIB.so -o libMYLIB.so MYLIB.o -L/the/cuda/lib/dir -lcudart
MYLIB.o : MYLIB.cu MYLIB.h
nvcc -m64 -arch=sm_20 -dc -Xcompiler '-fPIC' MYLIB.cu -o MYLIB.o -L/the/cuda/lib/dir -lcudart
test : test.cpp libMYlib.so
g++ test.cpp -o test -L. -ldl -Wl,-rpath,. -lMYLIB -L/the/cuda/lib/dir -lcudart
Run Code Online (Sandbox Code Playgroud)
确实
nm libMYLIB.so 显示所有 CUDA api函数都是"未定义的符号":
U __cudaRegisterFunction
U __cudaRegisterLinkedBinary_39_tmpxft_0000598c_00000000_6_CUPA_cpp1_ii_74c599a1
U cudaEventRecord
U cudaFree
U cudaGetDevice
U cudaGetDeviceProperties
U cudaGetErrorString
U cudaLaunch
U cudaMalloc …Run Code Online (Sandbox Code Playgroud) 假设我想从我的程序中调用一个子进程,我想将该子进程的输出读入我的程序.
这是一个简单的方法:
//somefile.cpp
system("sub_process arg1 arg2 -o file.out");
//call the subprocess and have it write to file
FILE *f = std::fopen("file.out", "r");
//.... and so on
Run Code Online (Sandbox Code Playgroud)
我们都知道i/o操作在计算上很慢.为了加快速度,我想跳过write-to-file-then-read-from-file步骤,而是将这个子进程的输出直接重定向到stdin(或其他一些流)
我该怎么做?如何跳过i/o操作?
注意:许多程序在运行时将一些诊断内容吐出到stdout中,并将输出的干净版本写入stdout(例如:stdout:"step1 ... done,step2 ... done,step3..done"-o file-out:"神奇的数字是:47.28"),所以忽略"-o"参数并相信该输出将自动重定向到stdout并不一定有用......
感谢所有提前.
因此,在SO和整个互联网上,如何使OpenMP易于使用的#pragma指令与C++同样易于使用的STL容器配合使用,会有很多困惑和沮丧.
每个人都有关变通的STL会谈vector,但对于非随机接入/双向容器,如map,list,set,等?
我遇到了这个问题并设计了一个非常简单明了的解决方法.我在这里介绍STL map,但它显然是可推广的.
串口版:
for (std::map<A,B>::iterator it = my_map.begin();
it != my_map.end();
++it)
{ /* do work with it */ }
Run Code Online (Sandbox Code Playgroud)
我提出的将OpenMP与STL一起使用的解决方案map:
//make an array of iterators.
int loop_length = my_map.size();
std::map<A,B>::iterator loop_array[ loop_length ];
std::map<A,B>::iterator allocate_it = my_map.begin();
for (int j=0; j<loop_length; ++j)
loop_array[j] = allocate_it++;
// now you can use OpenMP as usual:
#pragma omp parallel for
for (uint j=0; j<loop_length; ++j)
{ /* …Run Code Online (Sandbox Code Playgroud) grep -F -f file1 file2
Run Code Online (Sandbox Code Playgroud)
file1是90 Mb(250万行,每行一个字)
file2是45 Gb
无论我让它运行多久,该命令实际上都不会产生任何结果.显然,这超出了grep的范围.
似乎grep无法处理来自该-f选项的那么多查询.但是,以下命令确实产生了所需的结果:
head file1 > file3
grep -F -f file3 file2
Run Code Online (Sandbox Code Playgroud)
考虑到文件大小,我怀疑sed或awk是否也是合适的替代方案.
我不知道其他选择......请帮忙.学习一些sql命令是否值得?这简单吗?谁能指出我正确的方向?
set -eu
VAR=$(zcat file.gz | head -n 12)
Run Code Online (Sandbox Code Playgroud)
工作良好
set -eu -o pipefail
VAR=$(zcat file.gz | head -n 12)
Run Code Online (Sandbox Code Playgroud)
导致bash退出失败.这怎么会导致管道故障?
请注意,file.gz包含数百万行(约750 MB,已压缩).
我的程序非常适合MPI.每个CPU都有自己的,特定的(复杂的)作业,产生一个double,然后我使用a MPI_Reduce来乘以每个CPU的结果.
但我重复了很多次(> 100,000次).因此,我想到GPU会大大加快速度.
我已经谷歌了,但找不到任何具体的东西.你如何将MPI与GPU混合?有没有办法让程序查询和验证"哦,这个等级是GPU,所有其他都是CPU"? 有推荐的教程还是什么?
重要的是,我不想要或不需要全套GPU.我真的只需要很多CPU,然后单个GPU来加速常用MPI_Reduce操作.
这是我正在谈论的示意图:
假设我有500个CPU.每个CPU以某种方式产生,比如50 double秒.我需要将所有这些250,00加double在一起.然后我重复10,000到100万次.如果我可以拥有一个GPU(除500个CPU之外),这可能非常有效.double对于所有~100万个"状态",每个CPU将计算其50 秒.然后,所有500个CPU都会将它们发送double到GPU.然后GPU将为250 double万个"状态"中的每个状态乘以250,000 秒,产生100万个doubles.
这些数字并不准确.计算确实非常大.我只是想传达一般问题.