Tôi đã làm việc với một số mã chuyên sâu tính toán RẤT trong (gasp!) C #.
Tôi đang xây dựng một triển khai GPGPU của FDTD cho mô hình quang học. Trên một cụm nhỏ (128 bộ xử lý), nhiều mô phỏng của chúng tôi mất vài tuần để chạy. Tuy nhiên, việc triển khai GPU có xu hướng chạy nhanh hơn khoảng 50 lần - và đó là trên thẻ NVidia cấp độ người tiêu dùng. Chúng tôi hiện có một máy chủ với hai thẻ xử lý kép GTX295 (vài trăm lõi) và sẽ sớm nhận được một số Teslas.
Làm thế nào điều này liên quan đến ngôn ngữ của bạn? Cũng giống như mã CTD FDTD mà chúng ta đang sử dụng trước đây bị ràng buộc bởi CPU, chúng bị ràng buộc bởi GPU, do đó, sự khác biệt mã lực ( rất nhỏ) của mã được quản lý so với mã gốc không bao giờ được sử dụng. Ứng dụng C # hoạt động như một dây dẫn - tải hạt nhân OpenCL, truyền dữ liệu đến và từ GPU, cung cấp giao diện người dùng, báo cáo, v.v. - tất cả các tác vụ gây khó khăn cho C ++.
Trong những năm trước, sự khác biệt về hiệu năng giữa mã được quản lý và không được quản lý là đủ quan trọng đến mức đôi khi đáng để đưa ra mô hình đối tượng khủng khiếp của C ++ để có thêm vài phần trăm tốc độ. Ngày nay, chi phí phát triển của C ++ so với C # vượt xa lợi ích cho hầu hết các ứng dụng.
Ngoài ra, hầu hết sự khác biệt về hiệu suất của bạn sẽ không đến từ sự lựa chọn ngôn ngữ của bạn, mà từ kỹ năng của nhà phát triển của bạn. Vài tuần trước, tôi đã di chuyển một thao tác phân chia duy nhất từ bên trong vòng lặp ba lần (lồng ngang mảng 3D), giúp giảm 15% thời gian thực hiện cho một miền tính toán nhất định. Đó là kết quả của kiến trúc bộ xử lý: sự phân chia chậm, đó là một trong những khuôn mặt mà bạn chỉ cần chọn ở đâu đó.