小编cmo*_*cmo的帖子

c ++:如何优化IO?

我正在研究一个数学问题,它具有能够"预先计算"大约一半问题的优点,将这些信息保存到文件中,然后多次重复使用它来计算我的问题的各种"实例".困难在于上传所有这些信息以解决实际问题是一个主要的瓶颈.

更具体地说:我可以预先计算大量的信息 - 大量的概率(long double),大量的std::map<int,int>,以及更多 - 并将所有这些东西保存到磁盘(几个Gb).

我计划下半年接受输入参数d.对于每个D,我需要执行大量计算,这些计算涉及预先计算的数据(来自文件)和特定于D的一些其他数据的组合(因此每个D的问题都不同).

有时我需要从文件中挑选出某些预先计算好的信息.其他时候,我需要从(大)文件上传每一段数据.

是否有任何使IO更快的策略?

boost::mpi由于其他原因,我已经将程序并行化(MPI,via ),但无论如何,访问磁盘上的文件会使我的计算时间无法忍受.

任何策略或优化?

目前我正在做所有事情cstdio,即没有iostream.那会有很大的不同吗?

c++ io optimization

16
推荐指数
2
解决办法
3037
查看次数

多线程从磁盘读取?

假设我需要从磁盘上保存的同一文件中读取许多不同的独立数据块.

可以多线程上传这个吗?

相关:同一处理器上的所有线程是否使用相同的IO设备从磁盘读取?在这种情况下,多线程根本不会加速上传 - 线程只是排队等候.

(我目前正在使用OpenMP进行多线程处理.)

c++ io multithreading openmp

14
推荐指数
2
解决办法
6137
查看次数

c ++:浮点运算稳定性策略

任何人都可以推荐任何包含维护各种浮点运算稳定性的策略的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位有效数的任意精度库,但仍然适用相同的问题.

我主要关心的是:

  1. 准确汇总许多数字的策略(例如上面的例子).
  2. 乘法和除法何时可能不稳定?(如果我想规范化大量数字,我的归一化常数应该是多少?最小值?最大?中位数?)

c++ math floating-accuracy stability numerical-stability

11
推荐指数
1
解决办法
1922
查看次数

在第N次出现分隔符时拆分文件

在每第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"似乎没有这样做......

unix split file chunking

11
推荐指数
1
解决办法
4620
查看次数

cuda共享库链接:未定义引用cudaRegisterLinkedBinary

目标:

  1. 创建一个包含我的CUDA内核的共享库,该内核具有一个不含CUDA的包装器/头文件.
  2. test为共享库创建可执行文件.

问题

  1. 共享库MYLIB.so似乎编译得很好.(没问题).
  2. 链接错误:

./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)

c++ cuda makefile shared-libraries nvcc

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

c ++:subprocess输出到stdin

假设我想从我的程序中调用一个子进程,我想将该子进程的输出读入我的程序.

这是一个简单的方法:

//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并不一定有用......

感谢所有提前.

c++ redirect stdin stdout

10
推荐指数
1
解决办法
5215
查看次数

c ++:OpenMP和非随机访问STL容器 - 一种可能的解决方法

因此,在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)

c++ parallel-processing multithreading stl openmp

10
推荐指数
1
解决办法
3131
查看次数

grep -f巨大文件的替代品

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命令是否值得?这简单吗?谁能指出我正确的方向?

unix scripting grep large-files

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

bash zcat头导致pipefail?

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,已压缩).

bash

9
推荐指数
1
解决办法
1054
查看次数

MPI + GPU:如何混合这两种技术

我的程序非常适合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.
这些数字并不准确.计算确实非常大.我只是想传达一般问题.

gpu hpc mpi

8
推荐指数
1
解决办法
5669
查看次数