ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何在python / numpy中自动化BLAS的环境变量依赖基准?

2019-06-29 05:42:38  阅读:501  来源: 互联网

标签:python multithreading numpy blas python-3-3


我需要一些帮助来弄清楚如何在python中自动化基准测试工作.

我正在通过python中的numpy测试线程对BLAS库调用的影响.在Linux环境中,OpenBLAS中的线程通过环境变量OMP_NUM_THREADS进行控制.我想做一个测试,我将OMP_NUM_THREADS从1增加到最大值,在每个线程计数时计算一个例程,然后最终操作所有线程计数的聚合时间.

问题如下.环境变量可以在python中设置,但它们只影响子进程或子shell.所以我可以使用以下驱动程序代码正确运行我的基准测试:

#!/usr/bin/env python                                                                                                     # driver script for thread test
import os

thread_set =[1,2,4,8,16]
for thread in thread_set:

    os.environ['OMP_NUM_THREADS']='{:d}'.format(thread)
    os.system("echo $OMP_NUM_THREADS")
    os.system("numpy_test")

和numpy_test脚本:

#!/usr/bin/env python
#timing test for numpy dot product (using OpenBLAS)                                                      
#based on https://stackoverflow.com/questions/11443302/compiling-numpy-with-openblas-integration
import sys
import timeit

setup = "import numpy; x = numpy.random.random((1000,1000))"
count = 5

t = timeit.Timer("numpy.dot(x, x.T)", setup=setup)
dot_time = t.timeit(count)/count
print("dot: {:7.3g} sec".format(dot_time))

但分析这是一个非常手动的过程.

特别是,我无法将numpy_test的值dot_time返回到我的外包装程序,因此我无法以任何自动方式分析测试结果.作为一个例子,我想绘制dot_time与线程数,或者评估dot_time /线程数是否恒定.

如果我尝试通过定义python测试函数(避免上面的os.system()方法)完全在python实例中进行类似的测试,然后在thread_set循环中的线程内运行测试函数,那么测试的所有实例函数为OMP_NUM_THREADS(父python shell的值)继承相同的值.所以这个测试失败了:

#!/usr/bin/env python
#attempt at testing threads that doesn't work
#(always uses inherited value of OMP_NUM_THREADS)
import os

import sys
import timeit

def test_numpy():
    setup = "import numpy; x = numpy.random.random((1000,1000))"
    count = 5

    t = timeit.Timer("numpy.dot(x, x.T)", setup=setup)
    dot_time = t.timeit(count)/count
    print("dot: {:7.3g} sec".format(dot_time))
    return dot_time

thread_set =[1,2,4,8,16]
for thread in thread_set:
    os.environ['OMP_NUM_THREADS']='{:d}'.format(thread)
    os.system("echo $OMP_NUM_THREADS")
    time_to_run = test_numpy()
    print(time_to_run)

这失败了因为每个线程实例都花费相同的时间,因为test_numpy()总是在父环境中继承OMP_NUM_THREADS的值,而不是通过os.environ()设置的值.如果这样的事情有效,那么做我需要做的分析是微不足道的.

在真正的测试中,我将运行几千个排列,因此自动化是关键.鉴于此,我很感激这些问题的答案:

>您将如何从像这样的子流程返回值(dot_time)?有没有比读/写文件更优雅的解决方案?
>有没有更好的方法来构建这种(依赖于环境变量)测试?

先感谢您.

解决方法:

你可以这样做:

import subprocess

os.environ['OMP_NUM_THREADS'] = '{:d}'.format(thread)
proc = subprocess.Popen(["numpy_test"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()

然后你将在stdout中获得numpy_test脚本的输出.一般来说,我认为subprocess.call和subprocess.Popen优先于os.system.

标签:python,multithreading,numpy,blas,python-3-3
来源: https://codeday.me/bug/20190629/1323557.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有