ajuste de fase por força bruta de entropia em rmn - cuda

30
Ajuste de Fase em RMN por Força Bruta de Análise de Entropia utilizando GPU’s Mario Gazziro (YAH!) André Osti (monitor)

Upload: mario-gazziro

Post on 27-Jun-2015

447 views

Category:

Technology


1 download

DESCRIPTION

ajuste de fase por força bruta de entropia em RMN - CUDA

TRANSCRIPT

Page 1: ajuste de fase por força bruta de entropia em RMN - CUDA

Ajuste de Fase em RMN por Força Bruta de Análise de Entropia utilizando

GPU’s

Mario Gazziro (YAH!)André Osti (monitor)

Page 2: ajuste de fase por força bruta de entropia em RMN - CUDA

Introdução

O hardware do espectrômetro pode gerar atrasos de fase no sistema de RMN. Soluções:

• Left-shift no FID (com zero padding a direita) – auxilia em distorções de linha de base;

• Ajustes de fase de ordem 0 e 1 no sinal (FID) ou no espectro (FFT);

• Demonstração de ajuste de fase com MATNMR;

Page 3: ajuste de fase por força bruta de entropia em RMN - CUDA

Minimização de Entropia

MinE -> função de minimização (mínimos quadrados)hi -> derivadas normalizadas do sinal (FID) ou do espectro (FFT) da RMNP -> função de penalidade para evitar bandas negativas

MinE

𝑅𝑖=𝑅 𝑖cos(Ф𝑖 )− 𝐼 𝑖 sen(Ф𝑖 ) Ф𝑖= h𝑝 𝑐 0+ h𝑝 𝑐1 𝑥𝑖𝑛

Page 4: ajuste de fase por força bruta de entropia em RMN - CUDA

Motivação

• Método tradicional utiliza minimos quadrados para determinar o melhor par de variáveis independentes para o ajuste de fases.

• Tal método pode eventualmente incorrer em mínimos locais, encontrando soluções não-ótimas.

• Estudos clinicos multi-espectrais são os exames mais afetados por eventuais erros.

Page 5: ajuste de fase por força bruta de entropia em RMN - CUDA

Objetivos

• Realizar a avaliação da menor entropia em um dado espectro, variando todas as possíveis combinações de fase (ordem 0 e ordem 1), além de toda o conjunto de pivots, garantindo encontrar a solução ótima (para esse critério).

Page 6: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

• Para um espectro de tamanho L, temos:

• Núm. de combinações para fase 0: 360• Núm. de combinações para fase 1: L• Núm. de combinações para o pivot: L

• Exemplo: L=1024Total de rotações + ver. Entropia = 360 x 1024 x 1024= 377.487.360

Page 7: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

• Tempo de execução em CPU: ~8 horas

• Dado o fato do problema ser intrinsicamente paralelizável, recomenda-se o uso de GPU’s (placas gráficas) para acelerar o resultado.

• O ajuste deve ser feito dentro do tempo de exame do paciente, em caso de necessidade de repetição do mesmo.

Page 8: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

Page 9: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

Page 10: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

FFT

Page 11: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

FFT

0 0 0

Page 12: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

FFT

0 0 0

3 0 0

Page 13: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

FFT

0 0 0

3 0 0

8 0 0

Page 14: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

FFT

0 0 0

3 0 0

8 0 0

= 0 0

Page 15: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

FFT

0 0 0

3 0 0

8 0 0

= 0 0

= 1 0

Page 16: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

FFT

0 0 0

3 0 0

8 0 0

= 0 0

= 1 0

= 2 0

Page 17: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

FFT

0 0 0

3 0 0

8 0 0

= 0 0

= 1 0

= 2 0

= 3 0

= 4 0

= 5 0

= 9 0

=10 0

= 6 0

= 7 0

=11 0

=12 0

=13 0

=14 0

=15 0

=16 0

Page 18: ajuste de fase por força bruta de entropia em RMN - CUDA

Metodologia

FFT

0 0 0

3 0 0

8 0 0

= 0 1

= 1 0

= 2 0

= 3 0

= 4 0

= 5 0

= 9 0

=10 0

= 6 0

= 7 0

=11 0

=12 0

=13 0

=14 0

=15 0

=16 0

Page 19: ajuste de fase por força bruta de entropia em RMN - CUDA

Resultados

• Tempo de execução médio (L=1024): 1:30 min• Aceleração de aproximadamente 300 vezes!

Page 20: ajuste de fase por força bruta de entropia em RMN - CUDA

Glycine: 1024fase 0 (cpu): -27fase 1 (cpu): 407pivot (cpu): 512entropia (cpu): 10.063338

fase 0 (gpu): -160 fase 1 (gpu): 408pivot (gpu): 844entropia: 10.061212

Page 21: ajuste de fase por força bruta de entropia em RMN - CUDA

AGB 1.5: 511fase 0 (cpu): 190fase 1 (cpu): 355pivot (cpu): 255entropia (cpu): 4.756013

fase 0 (gpu): -118fase 1 (gpu): 346pivot (gpu): 186entropia: 4.742389

Page 22: ajuste de fase por força bruta de entropia em RMN - CUDA

AGB 3.0 : 1024fase 0 (cpu): -83fase 1 (cpu): 418pivot (cpu): 512entropia (cpu): 129.76300

fase 0 (gpu): -168 fase 1 (gpu): 418pivot (gpu): 246entropia: 129.762581

Page 23: ajuste de fase por força bruta de entropia em RMN - CUDA

Bagac (C): 399fase 0 (cpu): -103fase 1 (cpu): 22pivot (cpu): 199entropia (cpu): 47.690609

fase 0 (gpu): -103 fase 1 (gpu): 23pivot (gpu): 187entropia: 47.682329

Page 24: ajuste de fase por força bruta de entropia em RMN - CUDA

Simulado D: 512fase 0 (cpu): 50fase 1 (cpu): 368pivot (cpu): 256entropia (cpu): 60204.57031

fase 0 (gpu): -24fase 1 (gpu): 369pivot (gpu): 360entropia: 60204.4742

Page 25: ajuste de fase por força bruta de entropia em RMN - CUDA

Copolimero: 1024fase 0 (cpu): -23fase 1 (cpu): 259pivot (cpu): 512entropia (cpu): 95.041626

fase 0 (gpu): -2fase 1 (gpu): 259pivot (gpu): 412entropia: 95.040409

Page 26: ajuste de fase por força bruta de entropia em RMN - CUDA

Edson: 1000 (8k orig.)fase 0 (cpu): 0fase 1 (cpu): 26pivot (cpu): 500entropia (cpu): 666.924438

fase 0 (gpu): -12 fase 1 (gpu): 26pivot (gpu): 983entropia: 666.922718

Page 27: ajuste de fase por força bruta de entropia em RMN - CUDA

Discussão

Análise dos resultados apresentados.

(Discussão dos resultados pelos membros do CIERMag)

Page 28: ajuste de fase por força bruta de entropia em RMN - CUDA

Conclusões

Com o advento do poder de processamento da ordem de teraflops (outrora disponível apenas em centros de supercomputação) formulamos o método de ajuste de fase por busca de mínima entropia através da força bruta. Tal método se mostrou bastante eficaz, ajustando pivots mais adequados e garantindo a descoberta dos valores mínimos globais para o problema de ajuste de fase em RMN.

Page 29: ajuste de fase por força bruta de entropia em RMN - CUDA

APÊNDICEmod = SourceModule("""__device__ int lock = 0;

__global__ void multiply_them(float *real, float *imag, int *size, int *entropia, int *phc0, int *phc1, int *pivot, int *overflow, float *flentropia){ __shared__ float realb[4096], imagb[4096], a_num[4096]; int phc0_local = threadIdx.x-180; int phc1_local = blockIdx.x; float pivot_local = blockIdx.y; float entropia_local; float ds1[4096]; int i, j = 0, index = 0; float theta; int size_local=*size;

float aux[3], temp; double sumDs = 0.0, sumas = 0.0, sumasSq = 0.0, H1 = 0.0, Pfun = 0.0, P, a;

if(threadIdx.x == 0){ for(i = 0; i < size_local; i++) { realb[i] = real[i]; imagb[i] = imag[i];

a_num[i] = -(i + 1.0)/size_local; } } __syncthreads();

pivot_local /= size_local; for(i = 0; i < size_local; i++) {

theta = 0.017452867 * (phc0_local + phc1_local * (a_num[i] + pivot_local));temp = realb[i] * __cosf(theta) - imagb[i] * __sinf(theta);aux[j++] = temp;a = temp - fabs(temp);sumas += a;sumasSq += a * a;

Page 30: ajuste de fase por força bruta de entropia em RMN - CUDA

if(j == 3) { //ds1 = abs((s0[3:L]-s0[1:L-2])/2)ds1[index] = fabs((aux[2] - aux[0])/2);sumDs += ds1[index];index++;aux[0] = aux[1];aux[1] = aux[2];j = 2;

} } for(i = 0; i < size_local - 2; i++) {

ds1[i] = ds1[i]/sumDs; //p1 = ds1 / sum(ds1)if(ds1[i] == 0) ds1[i] = 1; //p1[np.where(p1 == 0)[0]] = 1H1 += -ds1[i] * log(ds1[i]); //h1 = -p1 * log(p1)

//H1 = sum(h1) } if(sumas < 0) {

sumas = sumasSq;Pfun = Pfun + sumas/(size_local * size_local * 4);

} P = 1000 * Pfun; entropia_local = H1 + P; entropia_local = entropia_local *1000000.0; atomicMin(entropia, ((int)entropia_local)); __threadfence(); if((int)entropia_local == *entropia) {

int needlock = 1; while(needlock) {

if(atomicCAS(&lock, 0, 1) == 0){atomicAdd(overflow, 1);*flentropia = *entropia;*phc0 = phc0_local;*phc1 = phc1_local;*pivot = (int)(pivot_local * size_local);atomicExch(&lock, 0);needlock = 0;

} } } }