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)

description

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

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

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;

} } } }