• Aucun résultat trouvé

quater (Supprimé)

Dans le document RAPPORT 4032 et 4033 N° 830 N (Page 99-106)

tro de Mediana

Aplicações de processamento de imagem são muito comuns em ambientes computacionais. Em geral, uma imagem é representada por uma matriz de números, onde cada número tem sua cor correspondente a ser mostrada no vídeo. Dessa forma, quanto maior a ima- gem maior é o tamanho da matriz. Quando se tratar de imagens médicas, a velocidade de processamento é fundamental, uma vez que o tempo de resposta é um requisito funda- mental. Além disso, este tipo de aplicação requer imagens de alta resolução com a maior nitidez possível. É comum aplicar filtros de atenuação, suavização ou de reforço, para obter imagens nítidas. A aplicação destes filtros em imagens de alta resolução pode ser cara e exigir algum poder computacional. Por outro lado, a aplicação do filtro pode ser feita de forma paralela através da segmentação da imagem em blocos menores. Após a segmentação, o filtro é aplicado de forma distribuída, e os blocos resultantes são fundidos em uma nova imagem. Para ilustrar o uso da CEOL a seguir será detalhado um workflow

(a) (b)

Figura 4.1: Filtro de Mediana.

que aplica o filtro de mediana [263]. Esse tipo de filtro suavisa a imagem substituindo cada pixel pelo valor médio da sua vizinhança. Ele classifica os pixels na vizinhança e escolhe o valor de pixel mediano como o novo valor para o pixel de interesse [264]. Assim, para uma vizinhança de tamanho 1 (filtro 3x3), 9 elementos da matriz são ordenados e o valor da mediana é selecionado, como mostrado na Figura 4.1[a]. Para uma vizinhança de tamanho 2 (filtro 5x5), 25 elementos são classificados, e assim por diante.

O Modelo de Paralelismo Usado

Para aplicar o filtro de um modo distribuído, primeiro a imagem é dividida em blo- cos menores, depois aplica-se o filtro em cada bloco separadamente e fundi-se os blocos gerando a imagem final. Como o filtro usa um valor médio da vizinhança, há redundância de dados nos blocos gerados. Por exemplo, no filtro 3x3 a primeira e a última linhas de cada bloco são repetidas. No filtro 5x5 a redundância é de duas linhas no início e duas linhas no fim de cada bloco e no filtro 7x7 a redundância é de três linhas. A Figura 4.1[b] ilustra as operações de segmentação e de união dos blocos.

A Aplicação do Filtro

Para aplicar o filtro foi desenvolvido o serviço FactIPService que tem operações para: • Criar matrizes com elementos de dois bytes conforme a dimensão indicada (operação

createMatrix);

Segmentar o arquivo em blocos conforme tamanho indicado (operação sliceFile);Aplicar o filtro de mediana no arquivo gerando outro arquivo (operação medianFil-

ter);

Executar a junção dos blocos gerando o arquivo suavizado (operação mergeFiles); eExecutar um comando do sistema (operação runCommand).

As operações oferecidas pelo serviço FactIPService permitem avaliar várias formas de aplicar o filtro de mediana. Com as operações de FactIPService é possível criar workflows para:

• Aplicar o filtro sobre um único arquivo usando apenas um recurso computacional; • Segmentar o arquivo em blocos, aplicar o filtro em cada bloco de forma paralela

usando apenas um recurso computacional e reagrupar os blocos gerando o arquivo suavizado final;

• Segmentar o arquivo em blocos, aplicar o filtro em cada bloco de forma paralela usando vários recursos computacionais e reagrupar os blocos gerando o arquivo suavizado final;

Figura 4.2: DAG para o Workflow que aplica o filtro de mediana em 5 partes. O workflow ip–A2000x2000–5p.ceol, cujo DAG equivalente está na Figura 4.2, aplica o filtro de mediana 3x3 no arquivo /tmp/A–2000x2000, um arquivo que representa uma imagem de 2.000x2.000 pontos (12MB). No workflow o arquivo é particionado em cinco blocos, que são processados por cinco instâncias do serviço FactIPService executadas em paralelo e reagrupados gerando o arquivo final suavizado. Uma vez que escalonadores distintos podem ser usados em conjunto com o CEO, a CEOL oferece a opção do workflow abstrato onde o usuário deixa em aberto os hospedeiros onde serão criadas as instâncias

e onde a execução será feita. Neste exemplo o escalonador indica os hospedeiros e o CEO faz todos os acertos necessários no workflow para sincronizar as saidas e entradas das operações. Detalhes do workflow estão a seguir.

<?xml version="1.0" encoding="UTF-8"?> <ceo:workflow name="ip-A2000x2000-5p">

(1) <ceo:er os="Ubuntu" version="12.04 LTS 64" memory="2GB" disk="20GB" vcpus="2" secgroup="ceo-sg1">

<ceo:domain name="lrchybrid" domainlocation="ceo-lrc-hybrid.xml"/> <ceo:scheduler schld="1" schName="LocalRR" schAlgorithm="RR"

schURL="http://10.3.77.39:8443/wsrf/services/FactSS1Service"/> </ceo:er>

<ceo:definitions name="ip-A2000x2000-5p"> (2) <ceo:variables>

<ceo:variable name="retCode1" type="int" value="0"/> <ceo:variable name="retCode2" type="int" value="0"/> <ceo:variable name="retCode3" type="int" value="0"/> <ceo:variable name="retCode4" type="int" value="0"/> <ceo:variable name="retCode5" type="int" value="0"/> <ceo:variable name="sliceIn" type="string"

value="5 3 /tmp/A-2000x2000.txt"/> <ceo:variable name="sliceOut" type="string"/> <ceo:variable name="mFIn-1" type="string"

value="3 /tmp/A-2000x2000_s001.txt /tmp/A-2000x2000_smf001.txt"/> <ceo:variable name="mFIn-2" type="string"

value="3 /tmp/A-2000x2000_s002.txt /tmp/A-2000x2000_smf002.txt"/> <ceo:variable name="mFIn-3" type="string"

value="3 /tmp/A-2000x2000_s003.txt /tmp/A-2000x2000_smf003.txt"/> <ceo:variable name="mFIn-4" type="string"

value="3 /tmp/A-2000x2000_s004.txt /tmp/A-2000x2000_smf004.txt"/> <ceo:variable name="mFIn-5" type="string"

value="3 /tmp/A-2000x2000_s005.txt /tmp/A-2000x2000_smf005.txt"/> <ceo:variable name="mergeIn" type="string"

value="5 3 /tmp/A-2000x2000.txt A-2000x2000-MF3.txt"/> <ceo:variable name="mergeOut" type="string"/>

<ceo:services>

(3) <ceo:gsh name="imf1" gshId="1" hostId="1"

tsn="wsrf/services/factip/FactIPService" type="Factory"/>

<ceo:gsh name="imf2" gshId="2" hostId="2"

tsn="wsrf/services/factip/FactIPService" type="Factory"/>

<ceo:gsh name="imf3" gshId="3" hostId="3"

tsn="wsrf/services/factip/FactIPService" type="Factory"/>

<ceo:gsh name="imf4" gshId="4" hostId="4"

tsn="wsrf/services/factip/FactIPService" type="Factory"/>

<ceo:gsh name="imf5" gshId="5" hostId="5"

tsn="wsrf/services/factip/FactIPService" type="Factory"/>

<ceo:gsh name="imf6" gshId="6" hostId="6"

tsn="wsrf/services/factip/FactIPService" type="Factory"/> </ceo:services>

</ceo:definitions>

<ceo:process name="ip-A2000x2000-5p">

<!-- Divide o arquivo em 5 partes -->

(4) <ceo:invoke gsh="imf6" operation="sliceFile" pid="1" tagname="imf6-slice"> <ceo:filein tagname="FromStartNode"

source="user-01@CEO-SNI:A-2000x2000.txt" destination="user-01@imf6:A-2000x2000.txt" fs="12000012" afs="12000012"/>

<ceo:argument variable="sliceIn" type="string"/>

<ceo:return variable="sliceOut" type="string"/> </ceo:invoke>

<!-- Aplica o filtro nas cinco fatias em paralelo --> (5) <ceo:flow name="fMedianFilter">

<ceo:invoke gsh="imf1" operation="medianFilter" pid="2" tagname="imf1-mf">

<ceo:filein tagname="imf1-fi--mfs1"

source="user-01@imf6:A-2000x2000_s001.txt" destination="user-01@imf1:A-2000x2000_s001.txt"

fs="2406011" afs="2406011"/>

<ceo:argument variable="mFIn-1" type="string"/> <ceo:fileout tagname="imf1-imf6-mfs1"

source="user-01@imf1:A-2000x2000_smf001.txt" destination="user-01@imf6:A-2000x2000_smf001.txt" fs="2406011" afs="2406011"/>

<ceo:return variable="retCode1" type="int"/> </ceo:invoke>

<ceo:invoke gsh="imf2" operation="medianFilter" pid="3" tagname="imf2-mf">

<ceo:filein tagname="imf2-fi--mfs2"

source="user-01@imf6:A-2000x2000_s002.txt" destination="user-01@imf2:A-2000x2000_s002.txt" fs="2406011" afs="2406011"/>

<ceo:argument variable="mFIn-2" type="string"/> <ceo:fileout tagname="imf2-imf6-mfs2"

source="user-01@imf2:A-2000x2000_smf002.txt" destination="user-01@imf6:A-2000x2000_smf002.txt" fs="2406011" afs="2406011"/>

<ceo:return variable="retCode2" type="int"/> </ceo:invoke>

<ceo:invoke gsh="imf3" operation="medianFilter" pid="4" tagname="imf3-mf">

<ceo:filein tagname="imf3-fi--mfs3"

source="user-01@imf6:A-2000x2000_s003.txt" destination="user-01@imf3:A-2000x2000_s003.txt" fs="2406011" afs="2406011"/>

<ceo:argument variable="mFIn-3" type="string"/> <ceo:fileout tagname="imf3-imf6-mfs3"

source="user-01@imf3:A-2000x2000_smf003.txt" destination="user-01@imf6:A-2000x2000_smf003.txt" fs="2406011" afs="2406011"/>

<ceo:return variable="retCode3" type="int"/> </ceo:invoke>

<ceo:invoke gsh="imf4" operation="medianFilter" pid="5" tagname="imf4-mf">

<ceo:filein tagname="imf4-fi--mfs4"

source="user-01@imf6:A-2000x2000_s004.txt" destination="user-01@imf4:A-2000x2000_s004.txt" fs="2406011" afs="2406011"/>

<ceo:fileout tagname="imf4-imf6-mfs4"

source="user-01@imf4:A-2000x2000_smf004.txt" destination="user-01@imf6:A-2000x2000_smf004.txt" fs="2406011" afs="2406011"/>

<ceo:return variable="retCode4" type="int"/> </ceo:invoke>

<ceo:invoke gsh="imf5" operation="medianFilter" pid="6" tagname="imf5-mf">

<ceo:filein tagname="imf5-fi--mfs5"

source="user-01@imf6:A-2000x2000_s005.txt" destination="user-01@imf5:A-2000x2000_s005.txt" fs="2406011" afs="2406011"/>

<ceo:argument variable="mFIn-5" type="string"/> <ceo:fileout tagname="imf5-imf6-mfs5"

source="user-01@imf5:A-2000x2000_smf005.txt" destination="user-01@imf6:A-2000x2000_smf005.txt" fs="2406011" afs="2406011"/>

<ceo:return variable="retCode5" type="int"/> </ceo:invoke>

</ceo:flow>

<!-- Faz a união das fatias gerando o arquivo filtrado -->

(6) <ceo:invoke gsh="mf6" operation="mergeFiles" pid="7" tagname="imf1-merge"> <ceo:argument variable="mergeIn" type="string"/>

<ceo:fileout tagname="imf1-fo1--merge"

source="user-01@imf6:A-2000x2000_MF3.txt"

destination="user-01@CEO-ENI:A-2000x2000_MF3.txt" fs="12000012" afs="12000012"/>

<ceo:return variable="mergeOut" type="string"/> </ceo:invoke}>

<!-- Encerra o processamento retornando o valor ao Run Service --> <ceo:return variable="mergeOut" type="string"/>

</ceo:process> </ceo:workflow>

Em (1) estão requisitos do ambiente (<er>). Informa os recursos mínimos com os quais as VMs devem ser criadas para que tenham capacidade para executar os serviços do workflow. Em (2) são criadas as variáveis do workflow. Essas variáveis contêm in- formações que são passadas para os serviços durante a execução. Em (3) são criadas as

instâncias do serviço que fazem o processamento. São necessárias cinco instâncias, uma para cada bloco do arquivo. Em (4) é invocada a operação para particionar o arquivo em cinco blocos (operation=“sliceFile”); em (5) são usadas as cinco instâncias para aplicar simultaneamente o filtro em cada um dos blocos (operation=“medianFilter”). E em (6) os blocos já filtrados são reagrupados gerando um novo arquivo (operation=“mergeFiles”).

4.5 Esquemas XML CEO e CEOL

A seguir estão os esquemas XML para alguns elementos CEOL, cuja descrição é impor- tante para o completo entendimento de alguns elementos da linguagem.

• targetNamespace e Namespace

A seguir estão as definições para targetNamespace usado pelo CEOL, e outros es- quemas que são usados nas definições da linguagem.

<?xml version=“1.0” encoding=“UTF-8”?> <schema targetNamespace=“http://www.ic.unicamp.br/ceol/language” xmlns:tns=“http://www.ic.unicamp.br/ceol/language” xmlns:ceo=“http://www.ic.unicamp.br/ceol/language” xmlns:gjd=“http://www.globus.org/namespaces/2004/10/gram/job/description/” xmlns:gjt=“http://www.globus.org/namespaces/2004/10/gram/job/types/” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:wsa=“http://schemas.xmlsoap.org/ws/2004/03/addressing/” xmlns:wsdl=“http://schemas.xmlsoap.org/wsdl/”> ... </schema> • VariableType

Esse esquema mostra as opções para tipos de variáveis da CEOL. <!– Types declaration –>

<xsd:simpleType name=“VariableType”> <xsd:restriction base=“xsd:string”>

<xsd:enumeration value=“xsd:boolean”/> <xsd:enumeration value=“xsd:decimal”/> <xsd:enumeration value=“xsd:float”/> <xsd:enumeration value=“xsd:double”/> <xsd:enumeration value=“xsd:integer”/> </xsd:restriction> </xsd:simpleType> • ProviderType

Esse esquema mostra os tipos de provedores aceitos pela CEOL. <!– Types declaration –>

<xsd:simpleType name=“ProviderType” type=“xsd:string”/> • Requisitos de Ambiente

Este esquema documenta os requisitos de ambiente (environment requirements - er) que são usados nos workflows e em arquivos temporários (d2g, am) gerados durante a execução do workflow.

<!– Types declaration –>

<xsd:complexType name=“erDef”>

<xsd:attribute name=“os” type=“xsd:string”> <xsd:attribute name=“version” type=“xsd:string”> <xsd:attribute name=“memory” type=“xsd:string”> <xsd:attribute name=“disk” type=“xsd:string”>

<xsd:attribute name=“vcpus” type=“xsd:positiveInteger”>

<xsd:attribute name=“secgroup” type=“xsd:string” minOccurs=“0”> <xsd:element name=“domain” type=“ceo:domain” minOccurs=“0”> </xsd:complexType>

• Custo do Nó

Este esquema é parte das definições usadas nos arquivos temporários d2g e am. Documenta o custo de cada tarefa (cost of node - con) do DAG enviado por WMS ao escalonador.

<xsd:simpleType name=“conDef”>

<xsd:attribute name=“nid” type=“xsd:positiveInteger”> <xsd:attribute name=“gsh” type=“xsd:Name”>

<xsd:attribute name=“cost” type=“xsd:nonNegativeInteger”> <xsd:attribute name=“hostId” type=“xsd:nonNegativeInteger”> <xsd:attribute name=“hostclass” type=“xsd:nonNegativeInteger”

minOccurs=“0”>

<xsd:attribute name=“hURL” type=“xsd:anyURI”> <xsd:attribute name=“dId” type=“xsd:string”>

<xsd:attribute name=“image” type=“xsd:string” minOccurs=“0”> <xsd:attribute name=“flavor” type=“xsd:string” minOccurs=“0”> </xsd:simpleType>

• Custo da Aresta

Este esquema é parte das definições usadas nos arquivos temporários d2g e am. Documenta o custo de cada aresta (cost of edge - coe) do DAG enviado por WMS ao escalonador.

<!– Types declaration –>

<xsd:simpleType name=“coeDef”>

<xsd:attribute name=“edgeid” type=“xsd:positiveInteger”> <xsd:attribute name=“snode” type=“xsd:positiveInteger”> <xsd:attribute name=“enode” type=“xsd:positiveInteger”> <xsd:attribute name=“cost” type=“xsd:Integer”>

</xsd:simpleType>

• Definição de Classes de Hospedeiros

Este esquema documenta a definição de classes de recursos físicos agrupados por suas características.

<!– Types declaration – hostclass –> <xsd:simpleType name=“hostclassDef”>

<xsd:attribute name=“classname” type=“xsd:string”> <xsd:attribute name=“id” type=“xsd:positiveInteger”>

<xsd:attribute name=“processor” type=“xsd:string”> <xsd:attribute name=“clock” type=“xsd:string”>

<xsd:attribute name=“nofcores” type=“xsd:positiveInteger”> <xsd:attribute name=“ram” type=“xsd:string”>

<xsd:attribute name=“hdc” type=“xsd:string”>

<xsd:attribute name=“performance” type=“xsd:float”> </xsd:simpleType>

<!– Types declaration – defaulthostclass –> <xsd:simpleType name=“defaulthostclassDef”>

<xsd:attribute name=“classname” type=“xsd:string”> <xsd:attribute name=“id” type=“xsd:positiveInteger”> </xsd:simpleType>

<!– Types declaration – hostclasses –> <xsd:complexType name=“hostclasses”>

<xsd:attribute name=“nofhc” type=“xsd:positiveInteger” minOccurs=“0”> <xsd:attribute name=“filepath” type=“xsd:string” minOccurs=“0”>

<xsd:element name=“defaulthostclass” type=“ceo:defaulthostclassDef” minOc- curs=“0”>

<xsd:element name=“hostclass” type=“ceo:hostclassDef” minOccurs=“0”> </xsd:complexType>

• Definição de Hospedeiros

Os esquemas a seguir documentam a definição de hospedeiros usada para identificar os recursos físicos do ambiente.

<!– Types declaration – hosttype –> <xsd:simpleType name=“hosttypeDef”> <xsd:restriction base=“xsd:string”> <xsd:enumeration value=“gridportal”/> <xsd:enumeration value=“cloudportal”/> <xsd:enumeration value=“controller”/> <xsd:enumeration value=“compute”/>

</xsd:restriction> </xsd:simpleType>

<!– Types declaration – host –> <xsd:complexType name=“hostDef”>

<xsd:attribute name=“hostname” type=“xsd:string”>

<xsd:attribute name=“hostId” type=“xsd:nonNegativeInteger”> <xsd:attribute name=“uhn” type=“xsd:anyURI”>

<xsd:attribute name=“ip” type=“xsd:string”> <xsd:attribute name=“cip” type=“xsd:string”>

<xsd:attribute name=“hosttype” type=“ceo:hosttypeDef”> <xsd:element name=“hostclass” type=“ceo:hostclassDef”> </xsd:complexType>

<!– Types declaration – hosts –> <xsd:complexType name=“hosts”>

<xsd:attribute name=“nofhosts” type=“xsd:positiveInteger”> <xsd:element name=“host” type=“ceo:hostDef” minOccurs=“1”> </xsd:complexType>

• Definição de Classes de Imagens

Este esquema documenta a definição de imagens que servem de base para a criação de VMs em domínios com nuvens computacionais.

<!– Types declaration – image –>

<xsd:simpleType name=“imageDef”>

<xsd:attribute name=“imagename” type=“xsd:string”> <xsd:attribute name=“os” type=“xsd:string”>

<xsd:attribute name=“version” type=“xsd:string”> <xsd:attribute name=“instancetype” type=“xsd:string”> <xsd:attribute name=“providername” type=“xsd:string”> <xsd:attribute name=“providerid” type=“xsd:string”> </xsd:simpleType>

<!– Types declaration – images –> <xsd:complexType name=“images”>

<xsd:attribute name=“nofi” type=“xsd:positiveInteger”>

<xsd:element name=“image” type=“ceo:imageDef” minOccurs=“1”> </xsd:complexType>

• Definição de Classes que Modelam as Características das VMs

Este esquema documenta a definição das características a serem usadas na criação de VMs.

<!– Types declaration – flavor –>

<xsd:simpleType name=“flavorDef”>

<xsd:attribute name=“flavorname” type=“xsd:string”> <xsd:attribute name=“providername” type=“xsd:string”>

<xsd:attribute name=“providerid” type=“xsd:nonNegativeInteger”> <xsd:attribute name=“ram” type=“xsd:positiveInteger”>

<xsd:attribute name=“hdc” type=“xsd:nonNegativeInteger”> <xsd:attribute name=“ephemeral” type=“xsd:positiveInteger”> <xsd:attribute name=“swap” type=“xsd:nonNegativeInteger”> <xsd:attribute name=“vcpus” type=“xsd:positiveInteger”> </xsd:simpleType>

<!– Types declaration – flavors –> <xsd:complexType name=“flavors”>

<xsd:attribute name=“noff” type=“xsd:positiveInteger”>

<xsd:element name=“flavor” type=“ceo:flavorDef” minOccurs=“1”> </xsd:complexType>

• Definição de Classes de Domínios

A seguir estão definidos os esquemas que documentam grupos de segurança e domí- nios. São usados na configuração do ambiente híbrido.

<!– Types declaration – secgroup –>

<xsd:attribute name=“name” type=“xsd:string”>

<xsd:attribute name=“providername” type=“xsd:string”> <xsd:attribute name=“key” type=“xsd:string”>

</xsd:simpleType>

<!– Types declaration – secgroups –> <xsd:complexType name=“secgroupsDef”>

<xsd:attribute name=“nofg” type=“xsd:positiveInteger”>

<xsd:element name=“secgroup” type=“ceo:secgroupDef” minOccurs=“1”> </xsd:complexType>

<!– Types declaration – tipo de domínio –> <xsd:simpleType name=“domaintype”> <xsd:restriction base=“xsd:string”> <xsd:enumeration value=“privategrid”/> <xsd:enumeration value=“publicgrid”/> <xsd:enumeration value=“privatecloud”/> <xsd:enumeration value=“publiccloud”/> </xsd:restriction> </xsd:simpleType>

<!– Types declaration – modelo de negócio do domínio –> <xsd:simpleType name=“businessmodeltype”> <xsd:restriction base=“xsd:string”> <xsd:enumeration value=“iaas”/> <xsd:enumeration value=“paas”/> <xsd:enumeration value=“saas”/> <xsd:enumeration value=“waas”/> <xsd:enumeration value=“naas”/> <xsd:enumeration value=“ ”/> </xsd:restriction> </xsd:simpleType>

<!– Types declaration – tipo de acesso ao domínio –> <xsd:simpleType name=“accesstypeDef”> <xsd:restriction base=“xsd:string”> <xsd:enumeration value=“public”/> <xsd:enumeration value=“private”/> </xsd:restriction> </xsd:simpleType>

<!– Types declaration – subdomínios –> <xsd:simpleType name=“subdomainDef”>

<xsd:attribute name=“filepath” type=“xsd:string”>

Dans le document RAPPORT 4032 et 4033 N° 830 N (Page 99-106)