He estado retocando con árboles BSP desde hace un tiempo y también estoy jugando con hilos. Al agregar un triángulo a un árbol BSP, surge la oportunidad de crear un nuevo hilo para el procesamiento de datos en paralelo.¿Debo usar el enhebrado y la recursión juntos?
insert(triangle, bspnode) { .... else if(triangle spans bspnode) { (frontpiece, backpiece) = plane_split(triangle, bspnode) insert(frontpiece, bspnode.front) insert(backpiece, bspnode.back) } .... }
Las dos operaciones de inserción anteriormente podrían ser ejecutadas por dos hilos, y puesto que no modifiquen los mismos datos, sincronización barato pueden ser utilizados.
insert(triangle, bspnode) { .... else if(triangle spans bspnode) { (frontpiece, backpiece) = split(triangle, bspnode) handle = beginthread(insert(backpiece, bspnode.front)) insert(frontpiece, bspnode.back) if(handle) { waitforthread(handle) } else { insert(backpiece, bspnode.front) } } .... }
Este nuevo método trata de crear un hilo para completar la operación en paralelo, pero no debe fallar si el hilo no se puede crear (simplemente volverá al algoritmo original).
¿Es esta una práctica de programación de sonido, o estoy utilizando hilos de forma incorrecta? No he podido encontrar literatura sobre esta técnica. Me gusta que tiende a usar mi CPU al máximo (2 núcleos), y teóricamente escala a cualquier cantidad de procesadores disponibles. No me gusta que pueda ser terriblemente inútil en CPU y memoria.
¡Oh, y él RHYMES! :) HAHAH AGRADABLE! – Kiril
Empíricamente, considero que usar un número de hilos igual al número de núcleos disponibles + 1 conduce a un rendimiento ligeramente mejor. Pero como dices, la mejor manera de averiguarlo es probarlo en el entorno de producción y ver qué resultados proporciona. – corsiKa