Tôi có một bộ sưu tập các mô hình tính toán có thể được mô tả là automata di động không đồng bộ. Những mô hình này giống với mô hình Ising, nhưng phức tạp hơn một chút. Có vẻ như các mô hình như vậy sẽ được hưởng lợi từ việc chạy trên GPU chứ không phải CPU. Thật không may, nó không hoàn toàn đơn giản để song song với một mô hình như vậy, và tôi không rõ ràng về cách thực hiện nó. Tôi biết rằng có tài liệu về đề tài này, nhưng dường như tất cả đều nhắm vào các nhà khoa học máy tính khó tính, những người quan tâm đến các chi tiết về độ phức tạp thuật toán, thay vì một người như tôi chỉ muốn mô tả về một cái gì đó tôi có thể thực hiện, và do đó tôi thấy nó khá khó hiểu.
Để rõ ràng, tôi không tìm kiếm một thuật toán tối ưu nhiều như một thứ tôi có thể thực hiện nhanh chóng trong CUDA có khả năng tăng tốc đáng kể so với việc triển khai CPU của tôi. Thời gian lập trình viên là một yếu tố hạn chế hơn nhiều so với thời gian máy tính trong dự án này.
Tôi cũng nên làm rõ rằng một máy tự động di động không đồng bộ là một thứ khá khác so với máy đồng bộ và các kỹ thuật để song song các CA đồng bộ (như cuộc sống của Conway) không thể dễ dàng thích nghi với vấn đề này. Sự khác biệt là một CA đồng bộ cập nhật đồng thời mọi ô ở mọi thời điểm, trong khi đó một CA không đồng bộ cập nhật một vùng cục bộ được chọn ngẫu nhiên ở mỗi bước như được nêu dưới đây.
Các mô hình tôi muốn song song được triển khai trên một mạng tinh thể (thường là một hình lục giác) bao gồm ~ 100000 ô (mặc dù tôi muốn sử dụng nhiều hơn) và thuật toán không song song để chạy chúng trông như thế này:
Chọn một cặp ô lân cận ngẫu nhiên
Tính toán một "năng lượng" chức năng dựa trên một khu phố địa phương xung quanh các tế bào này
Với một xác suất mà phụ thuộc vào (với β một tham số), hoặc trao đổi các trạng thái của hai tế bào hoặc không làm gì cả.
Lặp lại các bước trên vô thời hạn.
Cũng có một số phức tạp liên quan đến các điều kiện biên, nhưng tôi tưởng tượng những điều này sẽ không gây khó khăn nhiều cho việc song song hóa.
Điều đáng nói là tôi quan tâm đến động lực nhất thời của các hệ thống này chứ không chỉ là trạng thái cân bằng, vì vậy tôi cần một cái gì đó có động lực tương đương với ở trên, thay vì chỉ là thứ sẽ tiếp cận phân phối cân bằng tương tự. (Vì vậy, các biến thể của thuật toán bảng điều khiển không phải là thứ tôi đang tìm kiếm.)
Khó khăn chính trong việc song song thuật toán trên là va chạm. Bởi vì tất cả các tính toán chỉ phụ thuộc vào một vùng cục bộ của mạng, nên nhiều trang mạng có thể được cập nhật song song, miễn là các vùng lân cận của chúng không bị chồng chéo. Câu hỏi là làm thế nào để tránh chồng chéo như vậy. Tôi có thể nghĩ ra một số cách, nhưng tôi không biết nếu đó là cách tốt nhất để thực hiện. Đó là như sau:
Sử dụng CPU để tạo danh sách các trang web lưới ngẫu nhiên và kiểm tra va chạm. Khi số lượng trang web lưới bằng số lượng bộ xử lý GPU hoặc nếu phát hiện xung đột, hãy gửi từng bộ tọa độ đến một đơn vị GPU để cập nhật trang web lưới tương ứng. Điều này sẽ dễ thực hiện nhưng có lẽ sẽ không tăng tốc nhiều, vì việc kiểm tra va chạm trên CPU có lẽ sẽ không rẻ hơn nhiều so với thực hiện toàn bộ cập nhật trên CPU.
Chia mạng tinh thể thành các vùng (một đơn vị cho mỗi đơn vị GPU) và có một đơn vị GPU chịu trách nhiệm chọn ngẫu nhiên và cập nhật các ô lưới trong khu vực của nó. Nhưng có nhiều vấn đề với ý tưởng này mà tôi không biết cách giải quyết, rõ ràng nhất là chính xác những gì sẽ xảy ra khi một đơn vị chọn một khu phố nằm chồng lên rìa của khu vực.
Xấp xỉ hệ thống như sau: hãy để thời gian tiến hành theo các bước riêng biệt. Chia lưới thành một khácthiết lập các vùng trên mỗi bước theo một sơ đồ được xác định trước và để mỗi đơn vị GPU chọn ngẫu nhiên và cập nhật một cặp ô lưới có vùng lân cận không chồng lấp ranh giới của vùng. Vì các ranh giới thay đổi mỗi lần bước này, ràng buộc này có thể không ảnh hưởng quá nhiều đến động lực, miễn là các vùng tương đối lớn. Điều này có vẻ dễ thực hiện và có khả năng nhanh, nhưng tôi không biết nó sẽ xấp xỉ động lực học như thế nào, hoặc kế hoạch tốt nhất để chọn ranh giới khu vực trên mỗi bước thời gian là gì. Tôi tìm thấy một số tài liệu tham khảo về "automata di động đồng bộ khối", có thể giống hoặc không giống như ý tưởng này. (Tôi không biết vì dường như tất cả các mô tả về phương pháp này đều bằng tiếng Nga hoặc nằm trong các nguồn mà tôi không có quyền truy cập.)
Các câu hỏi cụ thể của tôi như sau:
Có bất kỳ thuật toán nào ở trên là một cách hợp lý để tiếp cận song song hóa GPU của mô hình CA không đồng bộ không?
Có cách nào tốt hơn?
Có mã thư viện hiện có cho loại vấn đề này?
Tôi có thể tìm thấy mô tả bằng tiếng Anh rõ ràng về phương pháp "đồng bộ khối" ở đâu?
Phát triển
Tôi tin rằng tôi đã đưa ra một cách để song song một CA không đồng bộ có thể phù hợp. Thuật toán được phác thảo dưới đây dành cho một CA không đồng bộ thông thường chỉ cập nhật một ô tại một thời điểm, thay vì một cặp ô lân cận như của tôi. Có một số vấn đề với việc khái quát nó cho trường hợp cụ thể của tôi, nhưng tôi nghĩ rằng tôi có một ý tưởng làm thế nào để giải quyết chúng. Tuy nhiên, tôi không chắc nó sẽ mang lại bao nhiêu lợi ích về tốc độ, vì những lý do được thảo luận dưới đây.
Ý tưởng là thay thế CA không đồng bộ (từ đó là ACA) bằng CA đồng bộ ngẫu nhiên (SCA) hoạt động tương đương. Để làm điều này, trước tiên chúng ta tưởng tượng rằng ACA là một quá trình Poisson. Nghĩa là, thời gian tiến hành liên tục và mỗi ô là một xác suất không đổi trên mỗi đơn vị thời gian thực hiện chức năng cập nhật của nó, độc lập với các ô khác.
là một tham số có giá trị có thể được chọn tùy ý.)
Ở mỗi bước thời gian logic, các ô của SCA được cập nhật như sau:
Tôi tin rằng điều này đảm bảo rằng các ô sẽ được cập nhật theo thứ tự có thể được "giải mã" để tương ứng với ACA ban đầu, đồng thời tránh va chạm và cho phép một số ô được cập nhật song song. Tuy nhiên, do điểm đầu tiên ở trên, điều đó có nghĩa là hầu hết các bộ xử lý GPU sẽ hầu như không hoạt động trên mỗi bước thời gian của SCA, ít hơn lý tưởng.
Tôi cần suy nghĩ thêm về việc liệu hiệu suất của thuật toán này có thể được cải thiện hay không và làm thế nào để mở rộng thuật toán này để đối phó với trường hợp nhiều ô được cập nhật đồng thời trong ACA. Tuy nhiên, nó có vẻ đầy hứa hẹn vì vậy tôi nghĩ rằng tôi sẽ mô tả nó ở đây trong trường hợp bất kỳ ai (a) biết bất cứ điều gì tương tự trong tài liệu, hoặc (b) có thể cung cấp bất kỳ cái nhìn sâu sắc nào về những vấn đề còn lại này.
exp()
) vì vậy tôi sẽ không nghĩ rằng việc truyền bá nó qua nhiều luồng có ý nghĩa nhiều. Tôi nghĩ sẽ tốt hơn (và dễ dàng hơn cho tôi) để thử và cập nhật nhiều cặp song song, với một cặp cho mỗi luồng.