## # A tibble: 46,266 × 5
## PHASE TIMESTAMP SIZE LANG METHOD
## <chr> <dbl> <dbl> <chr> <chr>
## 1 FINAL_PROD 8.06 7295 cutensor sebal
## 2 FINAL_PROD 8.06 7295 cutensor sebal
## 3 FINAL_PROD 8.07 7295 cutensor sebal
## 4 FINAL_PROD 8.07 7295 cutensor sebal
## 5 FINAL_PROD 8.06 7295 cutensor sebal
## 6 FINAL_PROD 8.07 7295 cutensor sebal
## 7 FINAL_PROD 8.06 7295 cutensor sebal
## 8 FINAL_PROD 8.07 7295 cutensor sebal
## 9 FINAL_PROD 8.06 7295 cutensor sebal
## 10 FINAL_PROD 8.06 7295 cutensor sebal
## # ℹ 46,256 more rows
Inferencias: - A maior variação esta ocorrendo na implementação serial, talvez por influencia de cache ou arquitetura do processador. Apesar disso, o conjunto de 8000 execuções, junto aos baixos valores de coeficiente de variação (CV) e amplitude interquartil (IQR), confirma a consistência das medições e valida o uso da média como métrica para comparação.
Conclusão: - Os dados estão consistentes e a média é uma boa metrica para ser utilizada nas analises
Como podemos ver, a implementação em GPU obteve uma redução grande de tempo em relação a implementação serial. Contudo, podemos ver que a etapa de leitura dos dados é algo que consome muito tempo nas implementações em GPU. Dessa forma, neste documento iremos fazer 2 analises:
## # A tibble: 2 × 5
## # Groups: METHOD, PHASE [2]
## METHOD PHASE cutensor_speedup hybrid_speedup kernels_speedup
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 sebal TOTAL 5.17 5.21 5.60
## 2 steep TOTAL 9.71 9.82 10.2
## # A tibble: 2 × 5
## # Groups: METHOD, PHASE [2]
## METHOD PHASE cutensor_speedup hybrid_speedup kernels_speedup
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 sebal P_TOTAL_2 40.4 44.4 41.1
## 2 steep P_TOTAL_2 75.3 83.3 59.7
## # A tibble: 36 × 4
## PHASE METHOD LANG SPEEDUP
## <fct> <chr> <chr> <dbl>
## 1 FINAL_PROD sebal cutensor 106.
## 2 FINAL_PROD steep cutensor 106.
## 3 INITIAL_PROD sebal cutensor 96.5
## 4 INITIAL_PROD steep cutensor 96.1
## 5 PIXEL_SEL sebal cutensor 108.
## 6 PIXEL_SEL steep cutensor 850.
## 7 RAH sebal cutensor 39.6
## 8 RAH steep cutensor 47.2
## 9 READ_INPUT sebal cutensor 0.84
## 10 READ_INPUT steep cutensor 0.84
## # ℹ 26 more rows
Este gráfico apresenta os speedups das abordagens com GPU em relação a abordagem serial. Nela, percebemos que:
## # A tibble: 8 × 5
## # Groups: LANG [4]
## LANG METHOD total outliers percent_removed
## <chr> <chr> <int> <int> <dbl>
## 1 cutensor sebal 970 12 1.24
## 2 cutensor steep 968 8 0.826
## 3 hybrid sebal 960 16 1.67
## 4 hybrid steep 971 16 1.65
## 5 kernels sebal 971 13 1.34
## 6 kernels steep 954 17 1.78
## 7 serial sebal 957 32 3.34
## 8 serial steep 960 24 2.5
Como podemos observar, as distribuições se assemelham a uma distribuição normal. Como as distribuições são aproximadamente normais e temos amostras grandes (favorecendo o Teorema do Limite Central), podemos proceder com testes paramétricos (t-Student e ANOVA) para verificar diferenças estatisticamente significativas entre as abordagens.
H0: kernels = cutensor = hybrid H1: Pelo menos uma média é significativamente diferente
Realizando o teste ANOVA podemos ver através de p, que é praticamente 0, que as diferenças são estatisticamente significativas entre os três métodos, com Kernels consistentemente superior. Como no teste de ANOVA só consguimos dizer que uma média é significativamente diferente, podemos executar o test t student em pares para confirmar que todas as médias são significativamente diferentes entre si.
Ao analisarmos os intervalos de confiança, vemos que
## test_name p_value df t_critical t_result
## df...1 SEBAL Kernels vs cuTensor 0e+00 1884.208 1.961224 -622.71899
## df...2 SEBAL Kernels vs Hybrid 0e+00 1886.952 1.961222 -569.55311
## df...3 SEBAL cuTensor vs Hybrid 0e+00 1896.482 1.961216 66.43328
## df...4 STEEP Kernels vs cuTensor 0e+00 1820.828 1.961268 -367.09167
## df...5 STEEP Kernels vs Hybrid 0e+00 1795.777 1.961286 -267.18069
## df...6 STEEP cuTensor vs Hybrid 0e+00 1911.441 1.961206 85.65721
## t_range
## df...1 934.07848
## df...2 854.32967
## df...3 99.64992
## df...4 550.63750
## df...5 400.77104
## df...6 128.48582
H0: A abordagem de kernels teve melhor desempenho que a abordagem cutensor
H1: A abordagem kernels não teve melhor desempenho que a abordagem cutensor
Executando o test t entre pares, chegamos em P-valores extremamente baixos (todos 0), indicando diferenças estatisticamente significativas entre todos os pares comparados, com nível de confiança superior a 99.9%
Quando colocamos essas comparações em uma visualização, podemos ver que os intervalos de confiança (traços vermelhos dentro do boxplot) não se sobrepoem e apresentam-se bem concentrados em torno da média. Isso é esperado devido ao tamanho grande da amostra (cerca de 960-970 observações por grupo). Com amostras grandes, o erro padrão da média (que determina o intervalo de confiança) tende a ser pequeno.
Conclusão: A análise estatística revelou diferenças significativas entre todas as abordagens (p < 0.001), com a implementação em kernels demonstrando desempenho superior em termos de tempo total de execução. Este resultado pode ser atribuído ao overhead inicial da biblioteca cuTensor na inicialização dos tensores, que impacta o tempo total de processamento. Apesar das otimizações oferecidas pelo cuTensor para operações tensoriais, o custo de inicialização acaba prejudicando seu desempenho global quando comparado à abordagem direta em kernels CUDA.
## # A tibble: 8 × 5
## # Groups: LANG [4]
## LANG METHOD total outliers percent_removed
## <chr> <chr> <int> <int> <dbl>
## 1 cutensor sebal 970 4 0.412
## 2 cutensor steep 968 15 1.55
## 3 hybrid sebal 960 14 1.46
## 4 hybrid steep 971 31 3.19
## 5 kernels sebal 971 7 0.721
## 6 kernels steep 954 8 0.839
## 7 serial sebal 957 43 4.49
## 8 serial steep 960 30 3.12
Como podemos observar, as distribuições se assemelham a uma distribuição normal. Como as distribuições são aproximadamente normais e temos amostras grandes (favorecendo o Teorema do Limite Central), podemos proceder com testes paramétricos (t-Student e ANOVA) para verificar diferenças estatisticamente significativas entre as abordagens.
H0: kernels = cutensor = hybrid
H1: Pelo menos uma média é significativamente diferente
Realizando o teste ANOVA podemos ver através de p, que é praticamente 0, que as diferenças são estatisticamente significativas entre os três métodos, com Kernels consistentemente superior. Como no teste de ANOVA só consguimos dizer que uma média é significativamente diferente, podemos executar o test t student em pares para confirmar que todas as médias são significativamente diferentes entre si.
Ao analisarmos os intervalos de confiança, vemos que
## test_name p_value df t_critical t_result
## df...1 SEBAL Kernels vs cuTensor 5.8e-274 1697.492 1.961362 -43.00818
## df...2 SEBAL Kernels vs Hybrid 0e+00 1697.172 1.961363 190.52693
## df...3 SEBAL cuTensor vs Hybrid 0e+00 1909.453 1.961207 293.17737
## df...4 STEEP Kernels vs cuTensor 0e+00 1456.717 1.961594 781.10334
## df...5 STEEP Kernels vs Hybrid 0e+00 1416.065 1.961641 1080.95924
## df...6 STEEP cuTensor vs Hybrid 0e+00 1888.006 1.961221 438.62850
## t_range
## df...1 64.51227
## df...2 285.79040
## df...3 439.76606
## df...4 1171.65502
## df...5 1621.43887
## df...6 657.94275
H0: A abordagem de kernels teve melhor desempenho que a abordagem cutensor
H1: A abordagem kernels não teve melhor desempenho que a abordagem cutensor
Executando o test t entre pares, chegamos em P-valores extremamente baixos (todos 0), indicando diferenças estatisticamente significativas entre todos os pares comparados, com nível de confiança superior a 99.9%
Quando colocamos essas comparações em uma visualização, podemos ver que os intervalos de confiança (traços vermelhos dentro do boxplot) não se sobrepoem e apresentam-se bem concentrados em torno da média. Isso é esperado devido ao tamanho grande da amostra (cerca de 960-970 observações por grupo). Com amostras grandes, o erro padrão da média (que determina o intervalo de confiança) tende a ser pequeno.
Conclusão: A análise específica do desempenho no cálculo de produtos revelou superioridade da abordagem cuTensor, atribuída à especialização dos Tensor Cores. Embora a diferença de desempenho tenha sido moderada devido a natureza das operações realizadas, o impacto dos Tensor Cores foi significativa. A implementação híbrida, combinando CUDA Cores e Tensor Cores, demonstrou particular eficácia, resultando em redução perceptivel do tempo de execução.
Estes resultados estão bons o suficiente?
Posso rodar o experimento para diferentes imagens, talvez 30 imagens com varias execuções, a fim de deixar a pesquisa mais abrangente. Vale a pena?