小编Ali*_*eza的帖子

为什么这个随机数生成器不是线程安全的?

我正在使用rand()函数生成0,1之间的伪随机数用于模拟目的,但是当我决定使我的C++代码并行运行时(通过OpenMP),我注意到rand()它不是线程安全的,也不是很均匀.

所以我转而使用在其他问题的许多答案中提出的(所谓的)更均匀的生成器.看起来像这样

double rnd(const double & min, const double & max) {
    static thread_local mt19937* generator = nullptr;
    if (!generator) generator = new mt19937(clock() + omp_get_thread_num());
    uniform_real_distribution<double> distribution(min, max);
    return fabs(distribution(*generator));
}
Run Code Online (Sandbox Code Playgroud)

但是我在我模拟的原始问题中看到了许多科学错误.既反对结果rand()也反对常识的问题.

所以我编写了一个代码,用这个函数生成500k随机数,计算它们的平均值并做200次并绘制结果.

double SUM=0;
for(r=0; r<=10; r+=0.05){   
    #pragma omp parallel for ordered schedule(static)
    for(w=1; w<=500000; w++){   
        double a;
        a=rnd(0,1);
        SUM=SUM+a;
    } 
    SUM=SUM/w_max;
    ft<<r<<'\t'<<SUM<<'\n';
    SUM=0;
}   
Run Code Online (Sandbox Code Playgroud)

我们知道如果不是500k,我可以无限次地做它,它应该是一个值为0.5的简单线.但是有了500k,我们的波动将在0.5左右.

使用单个线程运行代码时,结果是可以接受的:

在此输入图像描述

但这是2个线程的结果:

在此输入图像描述

3个主题:

在此输入图像描述

4个主题:

在此输入图像描述

我现在没有我的8线程CPU,但结果甚至值得.

正如你所看到的,它们都不均匀,并且在平均值附近波动很大.

这个伪随机生成器线程也不安全吗?

或者我在某个地方犯了错误?

c++ random multithreading openmp

11
推荐指数
2
解决办法
566
查看次数

PyCharm 中的 Keras 不使用 GPU

这些线程没有解决我的问题: Keras does not use GPU on Pycharmhaving python 3.5 and Tensorflow 1.4

Keras 与 TensorFlow 后端不使用 GPU

我已经在运行 Windows 10 并具有 GTX 750 Ti 显卡的 PC 上安装了 Tensorflow 和 Tensorflow-gpu (v.1.12.0),因此它确实支持 CUDA。我还安装了 CUDA Toolkit v10 和 cuDNN 库,当我nvcc -V在命令提示符下运行时,我得到:

nvcc:NVIDIA (R) Cuda 编译器...

我正在使用 PyCharm,在 CPU 上运行 Keras 没有任何问题。但它不使用我的 GPU。

当我打字时

from keras import backend as K
K.tensorflow_backend._get_available_gpus()
Run Code Online (Sandbox Code Playgroud)

它说

2018-11-25 10:47:57.448275:我tensorflow / core / platform / cpu_feature_gaurd.cc:141]您的CPU支持此TensorFlow二进制文件未编译使用的指令:AVX2

[ ]

我尝试过的:

1)我尝试卸载 Tensorflow 和 Tensorflow-gpu 并重新安装 Tensorflow-gpu,如上面的线程所述。不起作用,我的代码不再在 CPU …

pycharm keras tensorflow

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

LAPACK zgemm op(A)维度

在netlib的这个链接中,它将M指定为:

在输入时,M指定矩阵op(A)和矩阵C的行数.M必须至少为零.退出时不变.

因此,如果我想使用3x10矩阵作为A,但我想使用它的zgmm共轭(TRANSA ='C')我应该输入哪个M?3或10?

此外,当我使用其他LAPACK例程时,我输入2D矩阵作为1D,如A [3*3]而不是A [3] [3],并且在调用例程时我只使用A作为矩阵,我可以对非执行相同操作方矩阵?A [3*10]而不是A [3] [10]?

我用C++编写代码.

c++ matrix lapack lapacke

3
推荐指数
1
解决办法
127
查看次数

标签 统计

c++ ×2

keras ×1

lapack ×1

lapacke ×1

matrix ×1

multithreading ×1

openmp ×1

pycharm ×1

random ×1

tensorflow ×1