mpi4py의 유니버설 요청
MPI-2는 일반적인 요청 대상을 통해 프로그램에 사용자 정의 비막힘 동작을 제공하는 메커니즘을 제공합니다.사용자 정의 비차단 작업도 Request 대상을 되돌려줍니다. Test, Wait, 그리고 그것들의 변종을 사용하여 테스트하고 기다릴 수 있습니다.일반 요청 (generalized requests) 의 비저항 동작은 프로그램의 정상적인 실행 절차와 함께 실행될 수 있습니다.다른 MPI 작업과 달리 일반적인 요청과 관련된 작업은 MPI 환경이 아닌 응용 프로그램이 책임지고 실행하기 때문에 응용 프로그램이 관련 작업을 수행한 후에 MPI 환경에 알릴 수 있는 메커니즘이 있어야 한다.MPI를 위한 MPI를 제공합니다.Grequest.Complete 함수로 이러한'알림'을 실현한다. 이 메커니즘에서 MPI는 일반적인 요청 작업의 완성 상태만 보존하고 다른 상태 정보는 응용 프로그램 자체가 유지보수를 책임진다.
mpi4py에서 유니버설 요청 동작은 MPI.Grequest 객체로 완료합니다.MPI.Grequest 클래스는 MPI입니다.Request 클래스의 하위 클래스이므로 Wait와 Test 등의 방법을 사용할 수 있습니다.
다음은 유니버설 요청 생성 및 완성 방법에 대한 인터페이스입니다.
MPI.Grequest.Start(type cls, query_fn, free_fn, cancel_fn, args=None, kargs=None)
쿼리 리셋 함수
query_fn
, 리셋 함수free_fn
를 방출하고 리셋 함수cancel_fn
및 기타 매개 변수args
와 kargs
를 취소하여 유니버설 요청을 만들고 등록하여 MPI.Grequest 객체여기서 콜백 함수의 인터페이스는 다음과 같습니다.
query_fn(Status status, *args, **kargs)
query_fn은 작업 성공/실패/취소 등 일반적인 요청의 상태 정보를 설정합니다
status
.MPI.에서만Grequest.Complete가 반환된 후에야 실행될 수 있습니다.Wait,Wait_any,Wait_some,Wait_all;Test,Test_any,Test_some,Test_all;그리고 MPI.Grequest.Get_status 등에서query 를 호출합니다fn.매개 변수args
를 통해 kargs
로 추가 정보를 전달할 수 있습니다.free_fn(*args, **kargs)
이 함수는 일반적인 요청 대상을 방출할 때 호출되며, 프로그램이 요청한 메모리를 제거하는 데 사용됩니다.queryfn 이후 실행, Wait, Waitany,Wait_some,Wait_all;Test,Test_any,Test_some,Test_all;그리고 MPI.Grequest.Free 등의 호출이 실행을 트리거합니다.정상적인 프로그램 중freefn은 한 번만 실행됩니다.매개 변수
args
를 통해 kargs
로 추가 정보를 전달할 수 있습니다.cancel_fn(bool completed, *args, **kargs)
MPI.Grequest.Cancel 트리거 실행만약 cancel이 실행되었을 때 MPI를 완성했다면Grequest.Complete는 MPI가 cancelfn 전달
completed
= True, 그렇지 않으면 전달completed
= False.매개 변수args
를 통해 kargs
로 추가 정보를 전달할 수 있습니다.MPI.Grequest.Complete(self)
응용 프로그램 알림 MPI 환경에 대한 일반적인 요청 작업이 완료되었습니다. 이 때 MPI.Grequest.Wait Family 호출이 반환되고 MPI.Grequest.Test 시리즈 호출이 True로 반환됩니다.
관례
다음은 사용 예제를 제시한다.# greq.py
"""
Demonstrates the usage of generalized request.
Run this with 1 processes like:
$ mpiexec -n 1 python greq.py
or
$ python greq.py
"""
import time
import threading
from mpi4py import MPI
comm = MPI.COMM_WORLD
def query_fn(status, *args, **kargs):
print 'Call query_fn with args = %s, kargs = %s...' % (args, kargs)
status.source = MPI.UNDEFINED
status.tag = MPI.UNDEFINED
status.cancelled = False
status.Set_elements(MPI.BYTE, 0)
return MPI.SUCCESS
def free_fn(*args, **kargs):
print 'Call free_fn with args = %s, kargs = %s...' % (args, kargs)
if 'a' in kargs:
# change the kargs argument (have effect only for changeable type like list, dict, etc)
print "Append 3 to kargs['a']"
kargs['a'].append(3)
return MPI.SUCCESS
def cancel_fn(completed, *args, **kargs):
print 'Call cancel_fn with completed = %s, args = %s, kargs = %s...' % (completed, args, kargs)
return MPI.SUCCESS
# define an user-defined non-blocking operate
def iop(*args, **kargs):
def compute(greq):
# sleep 1 second to simulate a compute-intensive task
time.sleep(1.0)
# call Complete method to inform MPI implementation that
# the operation associated with this greq has completed
greq.Complete()
# create a generalized request
greq = MPI.Grequest.Start(query_fn, free_fn, cancel_fn, args=args, kargs=kargs)
# call compute in a separate thread, so it will not block the return of this
iop_thread = threading.Thread(target=compute, name='iop_thread', args=(greq,))
iop_thread.daemon = True
# start the thread
iop_thread.start()
return greq
a = []
print 'Before the cal of iop, a = %s' % a
# call the user-defined non-blocking operation,
# which will return a MPI.Grequest object immediately
greq = iop(1, 2, a=a)
# test if the non-blocking operate is completed
status = MPI.Status()
print 'Is complete: %s' % greq.Test(status)
print 'source = %d, tag = %d, cancelled = %s, count = %d' % (status.source, status.tag, status.cancelled, status.count)
# call Cancel
greq.Cancel()
print 'Is complete: %s' % greq.Test()
# wait 1 second for the complete of iop
time.sleep(1.0)
# call Cancel
greq.Cancel()
print 'Is complete: %s' % greq.Test(status)
print 'source = %d, tag = %d, cancelled = %s, count = %d' % (status.source, status.tag, status.cancelled, status.count)
try:
# call Cancel after the complete of iop, wich will throw an exception
greq.Cancel()
except MPI.Exception as e:
print e.error_string
print 'After the complete of iop, a = %s' % a
실행 결과는 다음과 같습니다.$ python greq.py
Before the cal of iop, a = []
Is complete: False
source = -1, tag = -1, cancelled = False, count = 0
Call cancel_fn with completed = False, args = (1, 2), kargs = {'a': []}...
Is complete: False
Call cancel_fn with completed = True, args = (1, 2), kargs = {'a': []}...
Call query_fn with args = (1, 2), kargs = {'a': []}...
Call free_fn with args = (1, 2), kargs = {'a': []}...
Append 3 to kargs['a']
Is complete: True
source = -32766, tag = -32766, cancelled = False, count = 0
MPI_ERR_REQUEST: invalid request
After the complete of iop, a = [3]
이상은 mpi4py의 유니버설 요청을 소개했고 다음 편에서는 mpi4py의 데이터 형식 분석을 소개할 것입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
# greq.py
"""
Demonstrates the usage of generalized request.
Run this with 1 processes like:
$ mpiexec -n 1 python greq.py
or
$ python greq.py
"""
import time
import threading
from mpi4py import MPI
comm = MPI.COMM_WORLD
def query_fn(status, *args, **kargs):
print 'Call query_fn with args = %s, kargs = %s...' % (args, kargs)
status.source = MPI.UNDEFINED
status.tag = MPI.UNDEFINED
status.cancelled = False
status.Set_elements(MPI.BYTE, 0)
return MPI.SUCCESS
def free_fn(*args, **kargs):
print 'Call free_fn with args = %s, kargs = %s...' % (args, kargs)
if 'a' in kargs:
# change the kargs argument (have effect only for changeable type like list, dict, etc)
print "Append 3 to kargs['a']"
kargs['a'].append(3)
return MPI.SUCCESS
def cancel_fn(completed, *args, **kargs):
print 'Call cancel_fn with completed = %s, args = %s, kargs = %s...' % (completed, args, kargs)
return MPI.SUCCESS
# define an user-defined non-blocking operate
def iop(*args, **kargs):
def compute(greq):
# sleep 1 second to simulate a compute-intensive task
time.sleep(1.0)
# call Complete method to inform MPI implementation that
# the operation associated with this greq has completed
greq.Complete()
# create a generalized request
greq = MPI.Grequest.Start(query_fn, free_fn, cancel_fn, args=args, kargs=kargs)
# call compute in a separate thread, so it will not block the return of this
iop_thread = threading.Thread(target=compute, name='iop_thread', args=(greq,))
iop_thread.daemon = True
# start the thread
iop_thread.start()
return greq
a = []
print 'Before the cal of iop, a = %s' % a
# call the user-defined non-blocking operation,
# which will return a MPI.Grequest object immediately
greq = iop(1, 2, a=a)
# test if the non-blocking operate is completed
status = MPI.Status()
print 'Is complete: %s' % greq.Test(status)
print 'source = %d, tag = %d, cancelled = %s, count = %d' % (status.source, status.tag, status.cancelled, status.count)
# call Cancel
greq.Cancel()
print 'Is complete: %s' % greq.Test()
# wait 1 second for the complete of iop
time.sleep(1.0)
# call Cancel
greq.Cancel()
print 'Is complete: %s' % greq.Test(status)
print 'source = %d, tag = %d, cancelled = %s, count = %d' % (status.source, status.tag, status.cancelled, status.count)
try:
# call Cancel after the complete of iop, wich will throw an exception
greq.Cancel()
except MPI.Exception as e:
print e.error_string
print 'After the complete of iop, a = %s' % a
$ python greq.py
Before the cal of iop, a = []
Is complete: False
source = -1, tag = -1, cancelled = False, count = 0
Call cancel_fn with completed = False, args = (1, 2), kargs = {'a': []}...
Is complete: False
Call cancel_fn with completed = True, args = (1, 2), kargs = {'a': []}...
Call query_fn with args = (1, 2), kargs = {'a': []}...
Call free_fn with args = (1, 2), kargs = {'a': []}...
Append 3 to kargs['a']
Is complete: True
source = -32766, tag = -32766, cancelled = False, count = 0
MPI_ERR_REQUEST: invalid request
After the complete of iop, a = [3]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.