Rumah >pembangunan bahagian belakang >C++ >Mengapakah penambahan 0.1f pada tatasusunan apungan jauh lebih perlahan daripada penambahan 0, dan bagaimanakah isu prestasi ini boleh ditangani?
Mengapakah penambahan 0.1f pada tatasusunan apungan memperlahankan prestasi sebanyak 10x berbanding dengan menambah 0?
Perbezaan prestasi timbul daripada pengendalian nombor titik terapung denormal (atau subnormal) oleh pemproses. Nombor denormal mewakili nilai yang sangat hampir dengan sifar, yang boleh memberi kesan ketara kepada prestasi.
Apabila anda menambah 0.1f pada tatasusunan apungan, hasilnya boleh menjadi nombor denormal, walaupun nilai asalnya tidak. Ini adalah kerana ketepatan terhad perwakilan titik terapung. Operasi pada nombor denormal lazimnya jauh lebih perlahan berbanding nombor biasa kerana banyak pemproses tidak dapat mengendalikannya secara langsung dan mesti menyelesaikannya menggunakan mikrokod.
Sebaliknya, menambah 0 pada tatasusunan apungan tidak menghasilkan nombor denormal. Ini kerana 0 sudah menjadi nombor ternormal. Oleh itu, operasi yang melibatkan 0 boleh dilakukan dengan lebih cekap.
Untuk menunjukkan kesan prestasi nombor denormal, pertimbangkan kod berikut:
const float x[16] = { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6}; const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812, 1.923, 2.034, 2.145, 2.256, 2.367, 2.478, 2.589, 2.690}; float y[16]; for (int i = 0; i < 16; i++) { y[i] = x[i]; } for (int j = 0; j < 9000000; j++) { for (int i = 0; i < 16; i++) { y[i] *= x[i]; y[i] /= z[i]; y[i] = y[i] + 0.1f; // <-- y[i] = y[i] - 0.1f; // <-- } }
Di sini, menambah 0.1f pada tatasusunan apungan mengakibatkan kelembapan yang ketara kerana nilai yang terhasil ditukar kepada nombor denormal.
Untuk mengelakkan kesan prestasi nombor denormal, anda boleh gunakan _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); intrinsik untuk mencairkan denormal kepada sifar. Ini bermakna bahawa sebarang nilai yang mungkin denormal sebaliknya dibundarkan kepada sifar. Dengan menggunakan intrinsik ini, anda boleh meningkatkan prestasi kod anda dengan ketara apabila bekerja dengan tatasusunan titik terapung.
Atas ialah kandungan terperinci Mengapakah penambahan 0.1f pada tatasusunan apungan jauh lebih perlahan daripada penambahan 0, dan bagaimanakah isu prestasi ini boleh ditangani?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!