我想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 …
我们最近发现我们正在为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) 在切换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
我使用 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) 以下代码可在 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
似乎每个 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) 我是 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 有办法存储内部“键”和单独的列标签,仅用于显示目的。