ฉันทำงานกับโค้ดที่ต้องใช้การคำนวณจำนวนมากใน (gasp!) C #
ฉันกำลังสร้างการใช้งาน GPGPU ของFDTDสำหรับการสร้างแบบจำลองทางแสง ในคลัสเตอร์ขนาดเล็ก (128 โปรเซสเซอร์) การจำลองสถานการณ์ของเราใช้เวลาหลายสัปดาห์ในการรัน อย่างไรก็ตามการใช้งาน GPU นั้นมีแนวโน้มที่จะทำงานได้เร็วขึ้นประมาณ 50x และอยู่ในการ์ด NVidia ระดับผู้บริโภค ตอนนี้เรามีเซิร์ฟเวอร์ที่มีการ์ดโปรเซสเซอร์คู่ GTX295 สองตัว (หลายร้อยคอร์) และกำลังได้รับเทสลาสบางตัวในไม่ช้า
สิ่งนี้เกี่ยวข้องกับภาษาของคุณอย่างไร ในทำนองเดียวกับที่รหัส C ++ FDTD ที่เราใช้ก่อนหน้านี้คือ CPU-bound เหล่านี้เป็น GPU-bound ดังนั้นความแตกต่างของแรงม้าที่มีขนาดเล็กมากของการจัดการกับ native code ไม่ได้เกิดขึ้น แอป C # ทำหน้าที่เป็นตัวนำ - การโหลดเมล็ด OpenCL ส่งผ่านข้อมูลไปยังและจาก GPU จัดหาส่วนต่อประสานผู้ใช้การรายงานและอื่น ๆ - งานทั้งหมดที่มีความเจ็บปวดในตูดใน C ++
ในปีที่ผ่านมาความแตกต่างด้านประสิทธิภาพระหว่างรหัสที่ได้รับการจัดการและไม่ได้รับการจัดการนั้นมีความสำคัญพอที่บางครั้งมันก็คุ้มค่าที่จะนำไปใช้กับโมเดลวัตถุที่น่ากลัวของ C ++ เพื่อให้ได้ความเร็วเพิ่มขึ้นเล็กน้อย ปัจจุบันค่าใช้จ่ายในการพัฒนาของ C ++ เทียบกับ C # มีมากกว่าประโยชน์ที่ได้รับจากแอปพลิเคชันส่วนใหญ่
นอกจากนี้ความแตกต่างด้านประสิทธิภาพส่วนใหญ่ของคุณไม่ได้มาจากภาษาที่คุณเลือก แต่มาจากทักษะของนักพัฒนาซอฟต์แวร์ของคุณ ไม่กี่สัปดาห์ที่ผ่านมาฉันย้ายการดำเนินการส่วนเดียวจากภายในของการวนซ้ำสามแถว (traversal อาร์เรย์แบบสามมิติ) ซึ่งลดเวลาการดำเนินการสำหรับโดเมนการคำนวณที่กำหนด 15% นั่นเป็นผลมาจากสถาปัตยกรรมตัวประมวลผล: การหารช้าซึ่งเป็นหนึ่งในใบหน้าที่คุณต้องหยิบขึ้นมาที่ไหนสักแห่ง