es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Algunos cálculos de CUDA fallan con una dimensión de bloque más grande (<1024).

Estoy aprendiendo CUDA con una GTX 960 de 4GB. Escribí un programa que realiza una multiplicación de matrices con elementos en el mismo orden. Cuando aumento las dimensiones de bloque para x e y a, digamos, (32 x 32) en combinación con una gran matriz (digamos, 15000 x 15000 elementos), algunos resultados de multiplicación, pero no todos, son incorrectos (valor 0 en lugar de 6).

Cuando disminuyo las dimensiones del bloque a, por ejemplo, (8 x 8), todos los resultados vuelven a ser correctos. Cuando disminuyo el tamaño de la matriz, los resultados también vuelven a ser correctos.

Así que en el caso de este ejemplo, parece haber combinaciones de hilos totales y hilos por bloque que no funcionan.

Me sorprende no encontrar ningún hilo respecto a este tema. Todo lo que puedo encontrar se trata de aumentar el rendimiento y la ocupación, pero no de cuando algunos, pero no todos, los cálculos se abortan.

Las dimensiones de la cuadrícula se calculan de la siguiente manera:

dim3 bloques (ceil < int > (COLS / hilos.x), ceil < int > (ROWS / hilos.y));

¿Por qué algunas multiplicaciones fallan mientras que otras son exitosas?

Algunos ejemplos

Dimensión del bloque: (8, 8)
Forma de la matriz: (15000, 15000)
Verificación: 0 elementos han fallado, longitud total 225000000, forma: (15000, 15000)

Dimensión del bloque: (16, 16)
Forma de la matriz: (15000, 15000)
Verificación: 239936 elementos han fallado, longitud total 225000000, forma: (15000, 15000)

Dimensión del bloque: (32, 32)
Forma de la matriz: (15000, 15000)
Verificación: 719424 elementos han fallado, longitud total 225000000, forma: (15000, 15000).

Dimensión del bloque: (32, 32)
Forma de la matriz: (10000, 10000)
Verificación: 0 elementos han fallado, longitud total 100000000, forma: (10000, 10000).

Versión del controlador

$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 470.82.00 Thu Oct 14 10:24:40 UTC 2021

Código completo

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con algunos, pero no todos los resultados de multiplicación incorrectos al aumentar las dimensiones de bloque a (32 x 32) en combinación con una matriz grande (15000 x 15000 elementos) se debe probablemente a la superación del número máximo de hilos que pueden ejecutarse simultáneamente por la GPU.

    Al aumentar las dimensiones de bloque, también se incrementa el número total de hilos, lo que puede exceder el número máximo de hilos que pueden ejecutarse simultáneamente en la GPU. Esto puede dar lugar a hilos detenidos o fallidos, lo que resulta en cálculos incorrectos para algunos elementos.

    Al disminuir las dimensiones del bloque, se reduce el número total de hilos, manteniéndose dentro del número máximo de hilos permitidos, y todos los resultados son correctos de nuevo.

    Para evitar este problema, es importante equilibrar el número de hilos y bloques para cumplir con los límites permitidos de la GPU. Esto puede involucrar pruebas de diferentes combinaciones de dimensiones de bloque e hilo, y trabajar con matrices más pequeñas para encontrar la configuración óptima para una GPU particular.

    También es importante tener en cuenta que este problema puede no ser específico de CUDA o las GPU de NVIDIA, sino que también podría ocurrir con otros marcos de procesamiento en paralelo y GPU.

Comments are closed.