Я пытаюсь кодировать параллельную версию простого алгоритма, который берет точку и список точек и находит точку списка, которая ближе к первой, чтобы сравнить время выполнения с последовательной версией. Проблема в том, что для запуска параллельной версии требуется более 1 минуты, а для последовательной версии - около 1 секунды.
Чтобы убедиться, что эффект параллелизма заметен, я тестирую код, используя список из 12 миллионы точек.
Детали моего процессора:
- Название модели: Intel® Core ™ (TM) i5-4210U CPU @ 1.70GHz
- CPU (s) ): 4
Вот две версии:
Общая часть:
type Point struct {
X float64
Y float64
}
func dist(p, q Point) float64 {
return math.Sqrt(math.Pow(p.X-q.X,2)+math.Pow(p.Y-q.Y,2))
}
Последовательная функция:
func s_argmin(p Point, points_list []Point, i,j int)(int){
best := 0
d := dist(p, points_list[0])
var new_d float64
for k:=i;k<j+1;k++{
new_d = dist(p, points_list[k])
if new_d < d{
d = new_d
best = k
}
}
return best
}
Параллельная функция :
func p_argmin(p Point, points_list []Point, i,j int)(int){
if i==j{
return i
}else{
mid := int((i+j)/2)
var argmin1, argmin2 int
c1 := make(chan int)
c2 := make(chan int)
go func(){
c1 <- p_argmin(p, points_list, i, mid)
}()
go func(){
c2 <- p_argmin(p, points_list, mid+1, j)
}()
argmin1 = <- c1
argmin2 = <- c2
close(c1)
close(c2)
if dist(p,points_list[argmin1])<dist(p,points_list[argmin2]){
return argmin1
}else{
return argmin2
}
}
}
Я также попытался ограничить параллелизм с помощью оптимизированной функции, которая выполняет параллельную версию функции только тогда, когда размер ввода (ji) больше значения, но последовательная версия всегда быстрее.
Как улучшить результат параллельной версии?