Buenas! La letra del ejercicio da a entender que la implementación del scan se tiene que hacer con un kernel solo, esto es así?
No me doy cuenta cómo explotar el paralelismo utilizando más de un bloque, teniendo en cuenta que al computar, el bloque siguiente necesitaría el último dato de los bloques anteriores parasumarlo a sus propios casilleros, y para estar seguro que estos datos ya están cargado, necesitaría hacer un cudaDeviceSynchronize() entre estas llamadas.
saludos
Hola,
Cuando decís un solo kernel ¿te referís en rutinas o en llamadas? La solución que tenía en mente se puede hacer llamando a un mismo kernel varias veces (haciendo algún cambio de parámetros) para generalizar la idea que funciona para un bloque pero si te queda más cómodo hacerlo con kernels distintos tampoco está mal. Como sugerencia empezá a pensar cómo la harías para un vector que entre en un bloque (i.e. cant_elems < cant_hilos_bloque) y luego generalizar de ahí, como decís vas a necesitar alguna sincronización en el medio.
Saludos!
Manuel
Cuando decís un solo kernel ¿te referís en rutinas o en llamadas? La solución que tenía en mente se puede hacer llamando a un mismo kernel varias veces (haciendo algún cambio de parámetros) para generalizar la idea que funciona para un bloque pero si te queda más cómodo hacerlo con kernels distintos tampoco está mal. Como sugerencia empezá a pensar cómo la harías para un vector que entre en un bloque (i.e. cant_elems < cant_hilos_bloque) y luego generalizar de ahí, como decís vas a necesitar alguna sincronización en el medio.
Saludos!
Manuel
Hola,
Amplio la respuesta con algunos otros enfoques que se podría usar. Una alternativa a lo que dije antes es que luego de hacer el scan local del bloque hacer una segunda pasada (otro kernel) con un solo bloque que vaya "arreglando". Otra opción sería que cada bloque luego de bajar a memoria el resultado de su scan local también guarde (en una estructura auxiliar) el último valor (que es el que necesitan los otros bloques) y luego hacer una segunda pasada que leyendo de esa estructura cada bloque arregle su scan local.
Saludos!
Manuel
Amplio la respuesta con algunos otros enfoques que se podría usar. Una alternativa a lo que dije antes es que luego de hacer el scan local del bloque hacer una segunda pasada (otro kernel) con un solo bloque que vaya "arreglando". Otra opción sería que cada bloque luego de bajar a memoria el resultado de su scan local también guarde (en una estructura auxiliar) el último valor (que es el que necesitan los otros bloques) y luego hacer una segunda pasada que leyendo de esa estructura cada bloque arregle su scan local.
Saludos!
Manuel
Hola Manuel,
exactamente era la última alternativa que comentaste la que tenemos implementada. De ahí venía mi pregunta.
Gracias por la respuesta,
Saludos!
exactamente era la última alternativa que comentaste la que tenemos implementada. De ahí venía mi pregunta.
Gracias por la respuesta,
Saludos!