小编coa*_*tal的帖子

GCC 4.5/Ubuntu 11.04是自动线程代码?

我提前道歉,我没有足够的术语来描述我的问题,而且我可能没有提供足够的信息.

我已经在gcc 4.4和OpenMPI/MPICH2下运行我的MPI代码数月了,在各种平台上都没有问题.最近我将一组服务器和我的桌面升级到Ubuntu 11.04(现在运行gcc 4.5),并在一个有8个处理器的节点上运行8个任务.通常我看到几乎100%的用户CPU利用率,现在我只看到60%的用户CPU和超过30%的系统CPU.当以这种方式运行时,这会导致我的代码显着减慢.

进一步调查,我只是运行了一个串行作业,并注意到该过程报告使用了150 +%的cpu时间.所以,我的程序是在多个处理器上进行多线程处理.我使用'ps -eLF'明确地验证了这一点并查看了每处理器的负载.

对于我的MPI代码来说,这是一个非常糟糕和低效的事情,我不知道它来自哪里.除了迁移到Ubuntu 11.04和gcc 4.5之外,没有任何改变.我已针对不同的OpenMPI版本验证了这一点.

我还在两个二进制兼容的机器之间移动二进制文件.如果我在另一台机器上编译(ubuntu 10.10/gcc 4.4)并在那里运行,一切都很好.将二进制文件移动到Ubuntu 11.04机器,相同的二进制文件开始自行穿线.

值得注意的是,我已明确禁用所有优化(-O0),认为我的默认值(-O3)可能包含我在4.5中无法理解的内容.无论优化级别如何,我都会得到相同的行为.

请让我知道我可以提供哪些进一步的信息来确定此问题的根源.

*附加信息*

响应请求的ldd的结果.简单来说,它是OpenMPI,libconfig和scalapack,以及标准的gcc内容:

linux-vdso.so.1 =>  (0x00007ffffd95d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2bd206a000)
libconfig.so.8 => /usr/lib/libconfig.so.8 (0x00007f2bd1e60000)
libscalapack-openmpi.so.1 => /usr/lib/libscalapack-openmpi.so.1 (0x00007f2bd151c000)
libmpi.so.0 => /usr/lib/libmpi.so.0 (0x00007f2bd126b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2bd0ed7000)
libblacsCinit-openmpi.so.1 => /usr/lib/libblacsCinit-openmpi.so.1 (0x00007f2bd0cd4000)
libblacs-openmpi.so.1 => /usr/lib/libblacs-openmpi.so.1 (0x00007f2bd0aa4000)
libblas.so.3gf => /usr/lib/libblas.so.3gf (0x00007f2bd022f000)
liblapack.so.3gf => /usr/lib/liblapack.so.3gf (0x00007f2bcf639000)
libmpi_f77.so.0 => /usr/lib/libmpi_f77.so.0 (0x00007f2bcf406000)
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f2bcf122000)
libopen-rte.so.0 => /usr/lib/libopen-rte.so.0 (0x00007f2bceed3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2bcecb5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2bd22fc000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2bcea9f000) …
Run Code Online (Sandbox Code Playgroud)

c compiler-construction gcc mpi

5
推荐指数
1
解决办法
608
查看次数

只计算向量CUDA/THRUST的正元素

我想使用Thrust(因为我的大部分方法是使用推力数据类型实现)或C CUDA,如果需要,只能对向量的正浮点元素求和.数据最初未排序.我的初始刺伤非常糟糕:基本上,复制矢量,对其进行排序,通过将其传递到内核来找到零交叉,该内核比较顺序成对值并写入与零交叉匹配的内核.排序后基本上(我用Thrust做)...

int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n - 1) {
  float a = vector[i];
  float b = vector[i + 1];
  if (a >= 0.0 && b < 0.0)
    answer = i + 1;
}
Run Code Online (Sandbox Code Playgroud)

这真的是愚蠢的,很多线程匹配条件,太多的读取,分支差异等等.所以,它完全失败,每次调用将在相同的数据上给出不同的结果,等等.

我还没有找到一个在Thrust中实现这个的好方法,这是我更喜欢的.排序后我不知道如何找到过零点.有关跳跃点的建议吗?一个实际工作简单的CUDA C实现也会很好.

cuda gpu gpgpu gpu-programming thrust

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

标签 统计

c ×1

compiler-construction ×1

cuda ×1

gcc ×1

gpgpu ×1

gpu ×1

gpu-programming ×1

mpi ×1

thrust ×1