pembandingan tabel pencarian trigonometri, peningkatan kinerja vs implementasi cpp

Kami sedang mengembangkan sistem real-time yang akan melakukan perhitungan sin/cos selama periode waktu kritis operasi. Kami sedang mempertimbangkan untuk menggunakan tabel pencarian untuk membantu kinerja, dan saya mencoba membandingkan manfaat/biaya penerapan tabel. Sayangnya kami belum mengetahui tingkat akurasi yang kami perlukan, tapi mungkin sekitar 5-6 koma desimal.

Saya pikir perbandingan fungsi trigonometri C++ dengan pendekatan pencarian telah dilakukan sebelumnya. Saya berharap seseorang dapat memberi saya tautan ke situs yang mendokumentasikan pembandingan tersebut. Jika hasil seperti itu tidak ada, saya akan menghargai saran apa pun tentang bagaimana saya dapat menentukan berapa banyak memori yang diperlukan untuk tabel pencarian dengan asumsi akurasi minimum tertentu, dan bagaimana saya dapat menentukan potensi manfaat kecepatan.

Terima kasih!


person errah    schedule 15.09.2010    source sumber


Jawaban (3)


Saya tidak dapat menjawab semua pertanyaan Anda, namun daripada mencoba menentukan manfaat kecepatan teoretis, Anda hampir pasti lebih baik membuat profilnya dalam aplikasi Anda yang sebenarnya. Kemudian Anda mendapatkan gambaran akurat tentang peningkatan seperti apa yang ingin Anda peroleh dalam domain masalah spesifik Anda, yang merupakan informasi paling berguna untuk kebutuhan Anda.

person Mark B    schedule 15.09.2010

Seberapa akurat masukan derajat Anda (mari kita gunakan derajat dibandingkan radian agar diskusi tetap "sederhana"). Sepersepuluh gelar? Seperseratus derajat? Jika presisi sudut Anda tidak bagus, maka hasil trigonometri Anda tidak bisa lebih baik lagi.

Saya telah melihat ini diimplementasikan sebagai array yang diindeks oleh seperseratus derajat (menjaga sudut sebagai bilangan bulat dengan dua titik desimal tersirat juga membantu perhitungan - tidak perlu menggunakan sudut radian ganda/float presisi tinggi).

Menyimpan nilai SIN dari 0,00 hingga 90,00 derajat akan menjadi nilai hasil float 9001 32 bit.

DOSA[0] = 0,0 ... DOSA[4500] = 0,7071068 ... DOSA[9000] = 1,0

Jika Anda memiliki SIN, properti trigonometri COS(a) = SIN(90-a) berarti Anda melakukan SIN[9000-a] untuk mendapatkan COS(a)

Jika Anda membutuhkan lebih banyak presisi tetapi tidak memiliki memori untuk ruang tabel lebih banyak, Anda dapat melakukan interpolasi linier antara dua entri dalam array, misalnya. SIN sebesar 45.00123 akan menjadi

DOSA[4500] + 0,123 * (DOSA[4501] - DOSA[4500])

person franji1    schedule 16.09.2010

Satu-satunya cara untuk mengetahui karakteristik kinerja kedua pendekatan tersebut adalah dengan mencobanya.

Ya, mungkin ada tolok ukur yang dibuat oleh orang lain, tetapi tolok ukur tersebut tidak berjalan dalam konteks kode Anda, dan tidak berjalan pada perangkat keras Anda, sehingga tidak terlalu dapat diterapkan pada situasi Anda.

Namun, satu hal yang dapat Anda lakukan adalah mencari latensi instruksi di manual CPU Anda. (Intel dan AMD menyediakan informasi ini dalam bentuk PDF di situs web mereka, dan sebagian besar produsen CPU lainnya memiliki dokumen serupa)

Maka Anda setidaknya dapat mengetahui seberapa cepat instruksi pemicu sebenarnya, memberi Anda garis dasar yang harus dikalahkan oleh tabel pencarian agar bermanfaat.

Tapi itu hanya memberi Anda perkiraan kasar pada satu sisi persamaan. Anda mungkin juga dapat membuat perkiraan kasar serupa mengenai biaya tabel pencarian, jika Anda mengetahui latensi cache CPU, dan Anda memiliki gambaran kasar tentang latensi akses memori.

Namun satu-satunya cara mendapatkan informasi akurat adalah dengan mencobanya. Implementasikan keduanya, dan lihat apa yang terjadi pada aplikasi Anda. Hanya dengan begitu Anda akan mengetahui mana yang lebih baik dalam kasus Anda.

person jalf    schedule 16.09.2010