小编use*_*069的帖子

C++ 11随机数生成器的线程安全性

在C++ 11中,有许多新的随机数生成器引擎和分发函数.它们是否安全?如果您在多个线程之间共享一个随机分布和引擎,它是否安全并且您是否仍会收到随机数?我正在寻找的场景是这样的,

void foo() {
    std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
    std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
#pragma omp parallel for
    for (int i = 0; i < 1000; i++) {
        double a = zeroToOne(engine);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用OpenMP或

void foo() {
    std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
    std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
    dispatch_apply(1000, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
        double a = zeroToOne(engine);
    });
}
Run Code Online (Sandbox Code Playgroud)

使用libdispatch.

c++ openmp thread-safety grand-central-dispatch c++11

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

OpenGL 3.2核心配置文件glLineWidth

我在Mac OS X上设置了一个OpenGL 3.2 Core上下文.我希望能够在屏幕上绘制一些厚厚的黑色.在以前版本的OpenGL中,我可以设置

glLineWidth(10.0f);
Run Code Online (Sandbox Code Playgroud)

我会得到一个10像素宽的线.但是当我检查3.2 Core中的线宽范围时

GLint range[2];
glGetIntegerv(GL_ALIASED_LINE_WIDTH_RANGE, range);
glGetIntegerv(GL_SMOOTH_LINE_WIDTH_RANGE, range);
Run Code Online (Sandbox Code Playgroud)

对于别名线,我得到1的值,对于平滑线,我得到0-1的值.如何在屏幕空间中创建一个10.0像素宽的线?除了使每个线段成为矩形之外,还有一种简单的方法来绘制它吗?

opengl osx-lion

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

Fortran:动态数组与自动数组避免内存分配

分析我们的一个fortran代码,有两个子程序占用了大部分计算时间(22.1%和17.2%).在每个例程中,大约5%的时间用于分配和释放内存.这些例程看起来像

MODULE foo

CONTAINS

SUBROUTINE bar( ... )
...
IMPLICIT NONE
...
REAL, ALLOCATABLE, DIMENSION(:,:) :: work
...
ALLOCATE (work(size1,size2))
...
DEALLOCATE (work)
END SUBROUTINE bar
...
END MODULE foo
Run Code Online (Sandbox Code Playgroud)

这些子程序在我的基准测试中被调用大约4000-5000次,所以我想摆脱ALLOCATE和DEALLOCATE.将这些更改为自动数组将更改为分析器输出.

MODULE foo

CONTAINS

SUBROUTINE bar( ... )
...
IMPLICIT NONE
...
REAL, DIMENSION(size1,size2) :: work
...
END SUBROUTINE bar
...
END MODULE foo
Run Code Online (Sandbox Code Playgroud)

将生成的配置文件更改为

Running Time        Symbol Name
20955.0ms  17.0%    __totzsp_mod_MOD_totzsps
    7.0ms   0.0%        malloc
    5.0ms   0.0%        free
    2.0ms   0.0%        user_trap

16192.0ms  13.2%    __tomnsp_mod_MOD_tomnsps
   20.0ms   0.0%        free
    3.0ms   0.0%        malloc …
Run Code Online (Sandbox Code Playgroud)

fortran

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

MPI将多个内部通信合并为一个内部组件

我试图将一堆生成的进程设置为单个intracomm.我需要将单独的进程生成到唯一的工作目录中,因为这些子进程会写出一堆文件.在产生所有进程之后,想要将它们合并到单个内部通信器中.为了试试这个,我设置了一个简单的测试程序.

int main(int argc, const char * argv[]) {
    int rank, size;

    const int num_children = 5;
    int error_codes;

    MPI_Init(&argc, (char ***)&argv);

    MPI_Comm parentcomm;
    MPI_Comm childcomm;
    MPI_Comm intracomm;
    MPI_Comm_get_parent(&parentcomm);

    if (parentcomm == MPI_COMM_NULL) {
        printf("Current Command %s\n", argv[0]);

        for (size_t i = 0; i < num_children; i++) {
            MPI_Comm_spawn(argv[0], MPI_ARGV_NULL, 1, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &childcomm, &error_codes);
            MPI_Intercomm_merge(childcomm, 0, &intracomm);
            MPI_Barrier(childcomm);
        }
    } else {
        MPI_Intercomm_merge(parentcomm, 1, &intracomm);
        MPI_Barrier(parentcomm);
    }

    printf("Test\n");

    MPI_Barrier(intracomm);

    printf("Test2\n");

    MPI_Comm_rank(intracomm, &rank);
    MPI_Comm_size(intracomm, &size);

    printf("Rank %d of %d\n", …
Run Code Online (Sandbox Code Playgroud)

mpi

7
推荐指数
2
解决办法
1442
查看次数

GLSL 1.5简单几何着色器

我试图在尝试修改内容之前编写一个简单的几何着色器,它只是通过顶点.

我的顶点着色器是

#version 150 core
in vec3 inPosition;
in vec4 inColor;

out vec4 vertexColor;

void main() {
    vertexColor = inColor;
    gl_Position = vec4(inPosition, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

我的几何着色器是

#version 150 core
layout (triangles) in;
layout (triangle_strip,  max_vertices=3) out;

void main() {
    gl_Position = gl_in[0].gl_Position;
    EmitVertex();

    gl_Position = gl_in[1].gl_Position;
    EmitVertex();

    gl_Position = gl_in[2].gl_Position;
    EmitVertex();
    EndPrimitive();
}
Run Code Online (Sandbox Code Playgroud)

我的片段着色器是

#version 150 core
in vec4 vertexColor;
out vec4 fragColor;

void main() {
    fragColor = vertexColor;
}
Run Code Online (Sandbox Code Playgroud)

如果没有链接几何着色器,一切正常.但是,当我在几何着色器中链接时,它停止工作.我错过了什么?我的几何着色器是否需要vertexColor来自我的顶点着色器的输入,如果是这样,如何完成?

opengl shader glsl geometry-shader

6
推荐指数
1
解决办法
6653
查看次数

cmake set_target_properties INCLUDE_DIRECTORIES 在 Linux 上被忽略

我有很多目标,我试图在每个目标的基础上设置包含目录。

set_target_properties (foo PROPERTIES INCLUDE_DIRECTORIES ${CMAKE_Fortran_MODULE_DIRECTORY}/bar)
Run Code Online (Sandbox Code Playgroud)

make VERBOSE=1当我在 Mac OS X 上构建 ( ) 时,我得到

... -J../build/modules/foo -I../build/modules/bar
Run Code Online (Sandbox Code Playgroud)

当我在 Linux 上做同样的事情时,我得到了

... -J../build/modules/foo ...
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一区别是,在 mac 上我使用 cmake 2.8.8,而在 linux 上我使用 2.8.7。2.8.8 之前的版本不支持此功能吗?

linux cmake

6
推荐指数
1
解决办法
4150
查看次数

在fortran名单列表输入文件中格式化2D数组

我正在为Fortran代码编写名单输入文件.我知道如果你有一维数组,你可以填充一系列元素,

&namelist
array(10) = 0, 1, 2, ......., n
&END
Run Code Online (Sandbox Code Playgroud)

相当于

&namelist
array(10) = 0
array(11) = 1
array(12) = 2
...
array(10 + n) = n
&END
Run Code Online (Sandbox Code Playgroud)

我现在需要写一个二维数组.我想做最短的等价物

&namelist
array2d(1,1) = 1
array2d(1,2) = 2
&END
Run Code Online (Sandbox Code Playgroud)

我能把它写成

&namelist
array2d(1) = 1, 2
&END
Run Code Online (Sandbox Code Playgroud)

或者我需要写这个

&namelist
array2d(1,1) = 1, 2
&END
Run Code Online (Sandbox Code Playgroud)

fortran

4
推荐指数
1
解决办法
4448
查看次数

gfortran 4.9.0 bug?WHERE语句优化了

我有一段代码在调试版本和优化版本之间的gfortran下产生不同的结果.

PROGRAM test

IMPLICIT NONE

REAL, DIMENSION(10) :: a = 0.0
REAL, DIMENSION(10) :: b = 1.0

WRITE (*,*) b
WHERE (a .ne. 0.0) b = a
WRITE (*,*) b

END PROGRAM
Run Code Online (Sandbox Code Playgroud)

当我将其编译为调试版本时,它会生成正确的结果.当我将它编译为优化构建时,它用a替换b的每个元素.

$ gfortran test.f
$ ./a.out
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
$ gfortran -O3 test.f
$ ./a.out
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0     
0.0 0.0 0.0 0.0 0.0 0.0 …
Run Code Online (Sandbox Code Playgroud)

fortran gfortran

3
推荐指数
2
解决办法
239
查看次数