小编Don*_*nna的帖子

IPython 的 %timeit 魔法的 -n 和 -r 参数

我想timeit在 Jupyter 笔记本中使用魔法命令对代码块计时。根据文档,timeit需要几个参数。两个特别控制循环次数和重复次数。我不清楚的是这两个论点之间的区别。例如

import numpy
N = 1000000
v = numpy.arange(N)

%timeit -n 10 -r 500 pass; w = v + v
Run Code Online (Sandbox Code Playgroud)

将运行 10 个循环和 500 次重复。我的问题是,

这可以解释为以下内容吗?(与实际计时结果有明显差异)

import time
n = 10
r = 500
T = numpy.empty(r)
for j in range(r):
    t0 = time.time()
    for i in range(n):
        w = v + v
    T[j] = (time.time() - t0)/n

print('Best time is {:.4f} ms'.format(max(T)*1000))
Run Code Online (Sandbox Code Playgroud)

我所做的一个假设很可能是不正确的,即内循环的时间是平均的 n通过这个循环迭代的。然后采用该循环的 500 次重复中最好的一次。

我搜索了文档,但没有找到任何可以准确说明这是做什么的。例如,这里的文档是

选项: -n:在循环中执行给定的语句次数。如果未给出此值,则选择一个拟合值。

-r:重复循环迭代次数并取最好的结果。默认值:3 …

python ipython jupyter

19
推荐指数
2
解决办法
3182
查看次数

在Fortran中分配时自动进行数组分配

我们最近发现我们正在为Fortran中的未分配数组进行分配.GNU gfortran编译器没有捕获错误,代码在OSX和Linux下运行.但是,IBM Power PC上的代码分段错误相同.

我的问题是,以下代码是否正确?似乎分配给的数组array在某些体系结构上自动分配内存,但在其他体系结构上则不然.是否有实施具体细节在这里工作?

代码是混合的C/Fortran代码:

#include <stdlib.h>

void assign_array_(double x[], int* n);
void print_array_();

int main()
{
    int n,i;
    double *x;

    n = 5;
    x = (double*) malloc(sizeof(double)*n);

    for (i = 0; i < n; i++)
        x[i] = (double) i;

    assign_array_(x,&n);
    print_array_();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和Fortran代码:

MODULE test_mod
  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: array
  integer :: nsize
END MODULE test_mod

SUBROUTINE assign_array(x,n)
  USE test_mod
  IMPLICIT NONE

  INTEGER :: n
  DOUBLE PRECISION :: x(n)

  CALL test_allocated()
  array = …
Run Code Online (Sandbox Code Playgroud)

memory arrays fortran gfortran

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

切换互联网连接后gethostbyname失败

在切换wifi主机后运行MPI作业时,我经常(但并不总是)遇到以下错误.

Fatal error in MPI_Init: Other MPI error, error stack:
MPIR_Init_thread(498)..............: 
MPID_Init(187).....................: channel initialization failed
MPIDI_CH3_Init(89).................: 
MPID_nem_init(320).................: 
MPID_nem_tcp_init(171).............: 
MPID_nem_tcp_get_business_card(418): 
MPID_nem_tcp_init(377).............: gethostbyname failed, MacBook-Pro.local     (errno 1)
Run Code Online (Sandbox Code Playgroud)

一切都在咖啡店工作正常,然后当我回到家时,我得到上述错误.没有其他改变.

我检查了/ etc/hosts和/ private/etc/hosts文件,看起来没问题 -

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
Run Code Online (Sandbox Code Playgroud)

我可以ping localhost,所以问题并不完全是localhost没有解决.

重新启动总能解决问题,但有什么简单的我可以做"重置"我的系统,以便它识别本地主机?

我无法访问我正在运行的代码中的MPI初始化例程的详细信息,并且没有对gethostname进行任何显式调用.

我正在使用MPICH 3.1.4(2015年2月建立)并运行OSX 10.10.3

macos mpi osx-yosemite

8
推荐指数
1
解决办法
1401
查看次数

为什么 gdb 需要 root 权限才能调试用户程序?

我使用 gdb 已经很成功一段时间了,但我最近升级了我的 Ubuntu 版本,现在看来,如果我以 root 身份运行,我只能让 gdb 成功运行我的程序。那是,

~ %  gdb -q sleep -ex 'run 60'
Reading symbols from /bin/sleep...(no debugging symbols found)...done.
Starting program: /bin/sleep 60
tcsh: Permission denied.
During startup program exited with code 1.
(gdb)
Run Code Online (Sandbox Code Playgroud)

失败,而

~ %  sudo gdb -q sleep -ex 'run 60'
Reading symbols from /bin/sleep...(no debugging symbols found)...done.
Starting program: /bin/sleep 60
Running .tcshrc
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
^C
Program received signal SIGINT, Interrupt. …
Run Code Online (Sandbox Code Playgroud)

linux gdb

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

释放从 c_f_pointer 定义的数组

以下代码可在 GNU gfortran 和 Intel ifort 中编译。但只有gfortran编译版本才能成功运行。

    program fort_tst
        use iso_c_binding

        INTEGER, POINTER :: a(:) 
        TYPE(C_PTR) :: ptr 

        INTEGER, POINTER :: b(:) 

        ALLOCATE(a(5)) 

        ptr = c_loc(a) 

        CALL c_f_pointer(ptr,b,[5]) 

        DEALLOCATE(b) 
    end program fort_tst
Run Code Online (Sandbox Code Playgroud)

英特尔编译代码中的错误是:

forrtl: severe (173): A pointer passed to DEALLOCATE points to an object that cannot be deallocated
Image              PC                Routine            Line        Source             
fort_tst           000000000040C5A1  Unknown               Unknown  Unknown
fort_tst           0000000000403A17  Unknown               Unknown  Unknown
fort_tst           0000000000403812  Unknown               Unknown  Unknown
libc-2.17.so       00002AAAAB20F555  __libc_start_main     Unknown  Unknown
fort_tst           0000000000403729  Unknown               Unknown  Unknown
Run Code Online (Sandbox Code Playgroud)

gfortran …

fortran pointers gfortran fortran-iso-c-binding intel-fortran

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

每个 SM 的最大居民块数?

似乎每个 SM 允许的驻留块数有最大数量。但是,虽然其他“硬”限制很容易找到(例如,通过“cudaGetDeviceProperties”),但驻留块的最大数量似乎没有被广泛记录。

在以下示例代码中,我将内核配置为每个块一个线程。为了测试该 GPU(P100)每个 SM 最多有 32 个驻留块的假设,我创建了一个 56*32 块的网格(56 = P100 上的 SM 数量)。每个内核需要 1 秒来处理(通过“睡眠”例程),因此如果我正确配置了内核,代码应该需要 1 秒。计时结果证实了这一点。配置 32*56+1 块需要 2 秒,表明每个 SM 32 个块是每个 SM 允许的最大值。

我想知道的是,为什么这个限制没有得到更广泛的应用?例如,它不显示“cudaGetDeviceProperties”。在哪里可以找到各种 GPU 的此限制?或者这可能不是真正的限制,而是从其他硬限制派生出来的?

我正在运行 CUDA 10.1

#include <stdio.h>
#include <sys/time.h>

double cpuSecond() {
    struct timeval tp;
    gettimeofday(&tp,NULL);
    return (double) tp.tv_sec + (double)tp.tv_usec*1e-6;
}

#define CLOCK_RATE 1328500  /* Modify from below */
__device__ void sleep(float t) {    
    clock_t t0 = clock64();
    clock_t t1 = t0;
    while ((t1 - t0)/(CLOCK_RATE*1000.0f) < t)
        t1 …
Run Code Online (Sandbox Code Playgroud)

cuda

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

在 Pandas 中显示与字典键名不同的列名?

我是 Pandas 的新手,看到有很多方法可以更改列标题。例如,该set_axis命令的工作方式如下:

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.arange(3),columns=['a'])
>>> df
   a
0  0
1  1
2  2
>>> df["a"][0]
0
>>> df.set_axis(['A'],axis=1,inplace=True)
>>> df
   A
0  0
1  1
2  2
>>> df["A"][0]  
0
Run Code Online (Sandbox Code Playgroud)

编辑:或者,可以使用

df.columns = ['A']
Run Code Online (Sandbox Code Playgroud)

更改列名称。

但是现在,如果我只想为了显示目的而更改列标题(因为标题标签不方便用作字典键),我必须创建一个全新的数据框:

>>> df_pretty = df.set_axis(['Long label (%)'],axis=1,inplace=False)
df_pretty
   Long label (%)
0               0  
1               1
2               2
Run Code Online (Sandbox Code Playgroud)

这是正确的吗?或者我错过了什么?为了打印而重新创建一个新的数据帧似乎是在浪费内存。我原以为 Pandas 有办法存储内部“键”和单独的列标签,仅用于显示目的。

pandas

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