在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.
我在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像素宽的线?除了使每个线段成为矩形之外,还有一种简单的方法来绘制它吗?
分析我们的一个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) 我试图将一堆生成的进程设置为单个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) 我试图在尝试修改内容之前编写一个简单的几何着色器,它只是通过顶点.
我的顶点着色器是
#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来自我的顶点着色器的输入,如果是这样,如何完成?
我有很多目标,我试图在每个目标的基础上设置包含目录。
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 之前的版本不支持此功能吗?
我正在为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) 我有一段代码在调试版本和优化版本之间的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)