使用OpenMP进行多线程处理时,如何退出多线程

使用OpenMP进行多线程处理时,如何退出多线程,第1张

终止线程的三种方法

1 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

2 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。

3 使用interrupt方法中断线程。

1 使用退出标志终止线程

当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){……}来处理。但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出。下面给出了一个利用退出标志终止线程的例子。

package chapter2;

public class ThreadFlag extends Thread

{

public volatile boolean exit = false;

public void run()

{

while (!exit);

}

public static void main(String[] args) throws Exception

{

ThreadFlag thread = new ThreadFlag();

threadstart();

sleep(5000); // 主线程延迟5秒

threadexit = true; // 终止线程thread

threadjoin();

Systemoutprintln("线程退出!");

}

}

在上面代码中定义了一个退出标志exit,当exit为true时,while循环退出,exit的默认值为false在定义exit时,使用了一个Java关键字volatile,这个关键字的目的是使exit同步,也就是说在同一时刻只能由一个线程来修改exit的值,

2 使用stop方法终止线程

使用stop方法可以强行终止正在运行或挂起的线程。我们可以使用如下的代码来终止线程:

threadstop();

虽然使用上面的代码可以终止线程,但使用stop方法是很危险的,就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,因此,并不推荐使用stop方法来终止线程。

3 使用interrupt方法终止线程

使用interrupt方法来终端线程可分为两种情况:

(1)线程处于阻塞状态,如使用了sleep方法。

(2)使用while(!isInterrupted()){……}来判断线程是否被中断。

在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出。下面的代码演示了在第一种情况下使用interrupt方法。

package chapter2;

public class ThreadInterrupt extends Thread

{

public void run()

{

try

{

sleep(50000); // 延迟50秒

}

catch (InterruptedException e)

{

Systemoutprintln(egetMessage());

}

}

public static void main(String[] args) throws Exception

{

Thread thread = new ThreadInterrupt();

threadstart();

Systemoutprintln("在50秒之内按任意键中断线程!");

Systeminread();

threadinterrupt();

threadjoin();

Systemoutprintln("线程已经退出!");

}

}

上面代码的运行结果如下:

在50秒之内按任意键中断线程!

sleep interrupted

线程已经退出!

在调用interrupt方法后, sleep方法抛出异常,然后输出错误信息:sleep interrupted

注意:在Thread类中有两个方法可以判断线程是否通过interrupt方法被终止。一个是静态的方法interrupted(),一个是非静态的方法isInterrupted(),这两个方法的区别是interrupted用来判断当前线是否被中断,而isInterrupted可以用来判断其他线程是否被中断。因此,while (!isInterrupted())也可以换成while (!Threadinterrupted())。

包 torch 包含了多维疑是的数据结构及基于其上的多种数学 *** 作。

如果 obj 是一个 pytorch 张量,则返回 True

如果 obj 是一个 pytorch storage 对象,则返回 True

返回 input 张量中的元素个数。

返回一个2维张量,对角线为1,其它位置为0

将 numpyndarray 转换为 Tensor , 返回的张量tensor和numpy的ndarray共享同一内存空间,修改一个会导致另一个也被修改,返回的张量不能改变大小

返回一个1维张量,包含在 start 和 end 上均匀间隔的 steps 个点

返回一个1维张量,包含在区间10exp(start)和10exp(end)上以对数刻度均匀间隔的 steps 个点。

返回一个全为1的张量,形状由可变参数 sizes 定义

返回一个张量,包含了从区间(0, 1)的均匀分布中抽取的一组随机数,形状由可变参数 sizes 定义。

返回一个张量,包含了从标准正态分布(mean=0, std=1)中抽取一组随机数,形状由可变参数 sizes 定义。

给定参数 n ,返回一个从0到n-1的随机整数排列

返回一个1维张量,长度为 floor((end-start)/step),以 step`为步长的一组序列值。

还是推荐使用 torcharange()

返回一个全为标量0的张量,形状由可变参数 sizes 定义

在给定维度上对输入的张量序列 seq 进行连接 *** 作。

在给定维度上将输入张量进行分块

沿给定轴 dim ,将输入索引张量 index 指定位置的值进行聚合。

沿指定维度对输入进行切片,取 index 中指定的相应项,然后返回一个新的张量,返回的张量与原始张量有相同的维度(在指定轴上), 返回的张量与原始张量不共享内存空间

根据掩码张量 mask 中的二元值,取输入张量中的指定项,将取值返回到一个新的1D张量。

张量 mask 须跟 input 张量有相同的元素数目,但形状或维度不需要相同。 返回的张量不与原始张量共享内存空间

返回一个包含输入 input 中非零元素索引的张量,输出张量中的每行包含输入中非零元素的索引

若输入 input 有 n 维,则输出的索引张量 output 形状为z n, 这里z是输入张量 input 中所有非零元素的个数

将输入张量分割成相等形状的chunks(如果可分)。如果沿指定维的张量形状大小不能被 split_size 整分,则最后一个分块会小于其它分块。

将输入张量形状中的 1 去除并返回,如果输入是形如(A 1 B 1 C 1 D),那么输出形状就为:(A B C D)。

当给定 dim 时,则只在给定维度上进行挤压,如输入形状为(A 1 B), squeeze(input, 0) ,将会保持张量不变,只有用 squeeze(input, 1) ,形状会变成(A B)。

输入张量与返回张量共享内存

沿着一个新维度对输入张量进行连接,序列中所有张量都应该为相同的形状。

输入一个矩阵(2维张量),并转置0,1维,可以被视为 transpose(input, 0, 1) 的简写函数

返回输入矩阵 input 的转置,交换维度 dim0 和 dim1 。 输入张量与输出张量共享内存。

移除指定维度后,返回一个元组,包含了沿着指定维切片后的各个切片

返回一个新的张量,对输入的指定位置插入维度 1 , 返回张量与输入张量共享内存,若 dim 为负,则将被转化为 dim+inputdim()+1

设定生成随机数的种子,并返回一个 torch_CGenerator 对象

返回生成随机数的原始种子值

返回随机生成器状态(ByteTensor)

设定随机生成器状态参数: new_state(torchByteTensor) - 期望的状态

从伯努利分布中抽取二元随机数(0或者1),输入中所有值必须在[0, 1]区间,输出张量的第 i 个元素值,将以输入张量的第 i 个概率值等于 1 。

返回值将会是与输入相同大小的张量,每个值为0或1

返回一个张量,每行包含从 input 相应行中定义的多项式分布中抽取的 num_samples 个样本。

input 每行的值不需要总和为1,但必须非负且总和不能为0

返回一个张量,包含从给定 means , std 的离散正态分布中抽取随机数,均值和标准差的形状不须匹配,但每个张量的元素个数须相同

保存一个对象到一个硬盘文件上

从磁盘文件中读取一个通过 torchsave() 保存的对象,可通过参数 map_location 动态地进行内存重映射

获得用于并行化CPU *** 作的OpenMP线程数

设定用于并行化CPU *** 作的OpenMP线程数

计算输入张量的每个元素绝对值

返回一个新张量,包含输入张量每个元素的反余弦

对输入张量 input 逐元素加上标量值 value ,并返回结果到一个新的张量。

用 tensor2 对 tensor1 逐元素相除,然后乘以标量值 value 并加到 tensor 上。

用 tensor2 对 tensor1 逐元素相乘,并对结果乘以标量值 value 然后加到 tensor ,张量形状不需要匹配,但元素数量必须一致。

返回一个新张量,包含输入 input 张量每个元素的反正弦函数

返回一个新张量,包含输入 input 张量每个元素的反正切函数

返回一个新张量,包含两个输入张量 input1 和 input2 的反正切函数

对输入 input 张量每个元素向上取整,即取不小于每个元素的最小整数,并返回结果到输出

将输入 input 张量每个元素值约束到区间[min, max],并返回结果到一个新张量

也可以只设定 min 或只设定 max

返回一个新张量,包含输入 input 张量每个元素的余弦

将 input 逐元素除以标量值 value ,并返回结果到输出张量 out

返回一个新张量,包含输入 input 张量每个元素的指数

返回一个新张量,包含输入 input 张量每个元素的floor,即不大于元素的最大整数。

计算除法余数,余数的正负与被除数相同

返回每个元素的分数部分

对两个张量以 start , end 做线性插值,将结果返回到输出张量

out = start + weight(end - start)

计算 input 的自然对数

计算 input + 1 的自然对数 y = log(x + 1)

对值比较小的输入,此函数比 torchlog() 更准确

用标量值 value 乘以输入 input 的每个元素,并返回一个新的结果张量

两个张量 input , other 按 元素相乘 ,并返回到输出张量,两个张量形状不须匹配,但总元素数须一致。当形状不匹配时, input 的形状作为输出张量的形状

返回一个新张量,包含输入 input 张量按元素取负。

对输入 input 按元素求 exponent 次幂,并返回结果张量。幂可以为 float 数或与 input 相同元素数的张量

base 为标量浮点值, input 为张量。

返回一个新张量,包含输入 input 张量每个元素的倒数,即10/x

返回一个新张量,包含输入 input 张量每个元素的除法余数,余数与除数有相同的符号。

返回一个新张量,将输入 input 张量每个元素四舍五入到最近的整数。

返回一个新张量,包含输入 input 张量每个元素的平方根倒数。

返回一个新张量,包含输入 input 张量每个元素的sigmoid值

符号函数:返回一个新张量,包含输入 input 张量每个元素的正负。

返回一个新张量,包含输入 input 张量每个元素的正弦。

返回一个新张量,包含输入 input 张量每个元素的双曲正弦。

返回一个新张量,包含输入 input 张量每个元素的平方根。

返回一个新张量,包含输入 input 张量每个元素的正切。

返回一个新张量,包含输入 input 张量每个元素的双曲正切。

返回一个新张量,包含输入 input 张量每个元素的截断值,使更接近零。即有符号数的小数部分被舍弃。

返回输入沿指定维度的累积积,如输入是一个N元向量,则结果也是一个N元向量,第 i 个输出元素值为 yi = x1 x2 x3 xi

返回输入沿指定维度的累积和

返回 (input - other) 的 p 范数

返回输入张量所有元素的均值

返回输入张量给定维度 dim 上每行的均值,输出形状与输入相同,除了给定维度上为1。

返回输入张量给定维度每行的中位数,同时返回一个包含中位数的索引。 dim 默认为输入张量的最后一维

返回给定维度 dim 上,每行的众数值,同时返回一个索引张量。 dim 值默认为输入张量的最后一维。输出形状与输入相同,除了给定维度上为1。

返回输入张量 input 的 p 范数。

返回输入张量给定维度 dim 上每行的 p 范数。

返回输入张量 input 所有元素的积

返回输入张量给定维度上每行的积。

返回输入张量 input 所有元素的标准差

返回输入张量给定维度上每行的标准差。

返回输入张量 input 所有元素的各

返回输入疑是给定维度上每行的和

返回输入张量所有元素的方差

返回输入张量给定维度上每行的方差。

比较元素相等性,第二个参数可为一个数,或与第一个参数同类型形状的张量

若两个张量有相同的形状和元素值,则返回 True , 否则 False 。

逐元素比较 input 和 other ,即是否 input >= other

第二个参数可以为一个数或与第一个参数相同形状和类型的张量。

逐元素比较 input 和 other ,是否 input > other 。若两个张量有相同的形状和元素值,则返回 True ,否则 False 。第二个参数

可以为一个数或与第一个参数相同形状和类型的张量。

取输入张量 input 指定维度上第 k 个最小值,若不指定 dim ,则默认为 input 的最后一维。返回一个元组,其中 indices 是原始输入张量 input 中沿 dim 维的第 k 个最小值下标。

逐元素比较 input 和 other ,即是否 input <= other ,第二个参数可以为一个数或与第一个参数相同形状和类型的张量。

逐元素比较 input 和 other ,即是否 input < other

返回输入张量给定维度上每行的最大值,并同时返回每个最大值的位置索引。

返回输入张量给定维度上每行的最小值,并同时返回每个最小值的位置索引。

input 中逐元素与 other 相应位置的元素对比,返回最小值到输出张量。两张量形状不需匹配,但元素数须相同。

逐元素比较 input 和 other , 即是否 input != other 。第二个参数可以为一个数或与第一个参数相同形状和类型的张量。

返回值:一个 torchByteTensor 张量,包含了每个位置的比较结果(如果tensor != other 为 True ,返回 1 )。

对输入张量 input 沿着指定维度按升序排序,如果不给定 dim ,默认为输入的最后一维。如果指定参数 descending 为 True ,则按降序排序。

返回两项:重排后的张量,和重排后元素在原张量的索引

沿给定 dim 维度返回输入张量 input 中 k 个最大值,不指定 dim ,则默认为最后一维,如果 largest 为 False ,则返回最小的 k 个值。

返回沿着维度 dim 上,两个张量 input 和 other 的叉积。 input 和 other 必须有相同的形状,且指定的 dim 维上size必须为 3 。如果不指定 dim ,则默认为第一个尺度为 3 的维。

如果输入是一个向量,则返回一个以 input 为对角线元素的2D方阵

如果输入是一个矩阵,则返回一个包含 input 为对角元素的1D张量

参数 diagonal 指定对角线:

计算输入张量的直方图。如果 min 和 max 都为0,则利用数据中的最大最小值作为边界。

返回一个张量,包含规范化后的各个子张量,使得沿着 dim 维划分的各子张量的p范数小于 maxnorm 。如果p范数的值小于 maxnorm ,则当前子张量不需要修改。

返回输入2维矩阵对角元素的和(迹)

返回一个张量,包含输入张量(2D张量)的下三角部分,其余部分设为0,参数 diagonal 控制对角线。

返回一个张量,包含输入矩阵的上三角部分,其余被置为 0 。

计算两个张量的点乘,两个张量都为1-D向量

计算方阵 a 的特征值和特征向量。

对方阵 input 求逆

对矩阵 mat1 和 mat2 进行相乘。

对矩阵 mat 和向量 vec 进行相乘。

作者:lyyfer

链接:>

备忘:

教程: Parallel Programming in Fortran 95 using OpenMP

使用 OpenMP 应该算是一种比较简单的并行方式,用

将需要并行的部分放进去就行了。

gfortran 编译的话使用 -fopenmp 选项即可

如果不是并行程序的话,仅仅会输出一次,但是这里输出了 4 次,因为有四个线程。而教程中也对这个做了解释:

Since the code enclosed between the two directives is executed by each thread, the message Hello appears in the screen as many times as threads are being used in the parallel region

不知道那个控制台的图标为啥变成了四个红点,是不是点的个数表示线程数呢?

One of the aims of the OpenMP standard is to offer the possibility of using the same source code lines with an OpenMP-compliant compiler and with a normal compiler This can only be achieved by hiding the OpenMP directives and commands in such a way, that a normal compiler is unable to see them For that purpose the following two directive sentinels are introduced: !$OMP & !$

需要注意的是 !$OMP 前面不能出现非空字符,否则将会被认为是普通的注释。OMP的这种方式可以很巧妙地使得程序能够在所有的编译器上运行,如果不支持OMP的话就当作普通的注释,如果支持那么这些就会起作用。另外 指令后面有一个空格,这个主要是为了 指令和后面的语句分隔开。这个空格是强制添加的,否则将作为普通注释来处理。

OMP 的指令行支持续行,和 fortran 没多大区别,只要记得每一行都有指令符号就行了。

暂时就学了这么点。。。

程序在线程数为50的时候效率达到最高,

应该是碰巧了。或者你的各个线程不独立。

我做过的实验,总运算分8份,用8线程,速度最快。

我做过的实验,总运算分16份,用16线程,速度一样快。同时只有8个在跑。

4份:CPU使用率达不到100% 速度也慢。

10份:CPU使用率也达不到100% 速度也慢。

我现在都是分成8份在运算。

以上就是关于使用OpenMP进行多线程处理时,如何退出多线程全部的内容,包括:使用OpenMP进行多线程处理时,如何退出多线程、torch常用基础函数、为什么服务器linux下用openmp结果比单线程还要慢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9622376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存