Trong khi cố gắng cải thiện hiệu suất của lớp phát hiện va chạm của mình, tôi thấy rằng ~ 80% thời gian dành cho gpu, nó dành cho các điều kiện nếu / khác chỉ cố gắng tìm ra giới hạn cho các thùng mà nó sẽ lặp lại.
Chính xác hơn:
mỗi luồng nhận được một ID, bằng ID đó, nó tìm nạp tam giác của nó từ bộ nhớ (mỗi 3 số nguyên) và bởi 3 luồng đó, nó tìm nạp các đỉnh của nó (mỗi 3 lần nổi).
Sau đó, nó biến đổi các đỉnh thành các điểm lưới số nguyên (hiện tại là 8x8x8) và biến chúng thành các giới hạn tam giác trên lưới đó
Để biến 3 điểm thành giới hạn, nó tìm tối thiểu / tối đa của mỗi chiều trong mỗi điểm
Vì ngôn ngữ lập trình tôi đang sử dụng thiếu nội tại minmax, tôi đã tự tạo một ngôn ngữ, trông như thế này:
procedure MinMax(a, b, c):
local min, max
if a > b:
max = a
min = b
else:
max = b
min = a
if c > max:
max = c
else:
if c < min:
min = c
return (min, max)
Vì vậy, trung bình nên là 2,5 * 3 * 3 = 22,5 so sánh kết thúc bằng cách ăn nhiều thời gian hơn so với các thử nghiệm giao cắt cạnh tam giác thực tế (khoảng 100 * 11-50 hướng dẫn).
Trên thực tế, tôi thấy rằng việc tính toán trước các nhóm cần thiết trên cpu (luồng đơn, không vector hóa), xếp chúng trong chế độ xem gpu cùng với định nghĩa nhóm và làm cho gpu thực hiện ~ 4 lần đọc thêm cho mỗi luồng nhanh hơn 6 lần so với thử để tìm ra giới hạn tại chỗ. (lưu ý rằng chúng được tính toán lại trước mỗi lần thực hiện vì tôi đang xử lý các lưới động)
Vậy tại sao sự so sánh lại chậm đến mức khủng khiếp trên một gpu?