Skip to main content

მოდულის გამოთვლა განშტოებების გარეშე

branchless abs function
        მოდულის გამოთვლის ფუნქცია არის ერთ-ერთი ყველაზე ხშირად გამოყენებადი ფუნქცია სხვადასხვა ტიპის გამოთვლების დროს, შესაბამისად ისეთი აპლიკაციებისთვის, რომელთათვისაც წარმადობა ძალიან მნიშვნელოვანია, მნიშვნელოვანია ასევე ამ ფუნქციის ოპტიმალური გადაწყვეტა. ფუნქციის ყველაზე მარტივი იმპლიმენტაცია ასე გამოიყურება :

int abs( int value ) {
        if( value < 0 )
                 return -value;
        return value;


        პროგრამულ კოდში დამატებითი განშტოებები გარკვეული ტიპის გამომთვლელი მოწყობილობებისათვის, მაგალითად GPU-სთვის, მკვეთრად ართულებს გამოთვლით პროცესს და საბოლოოდ ამცირებს წარმადობას. float-ის შემთხვევაში ჩვენ ვიცით, რომ ყველაზე მაღალი ბიტი გამოყოფილია ნიშნის შესანახად და მისი ცვლილება მოდულის ცვლილებას არ იწვევს, შესაბამისად რიცხვის მოდულის დასათვლელად საკმარისია ყველაზე მაღალ ბიტში დადებითი ნიშნის დაფიქსირება, რაც მოგვცემს სასურველ შედეგს. ამოცანა რთულდება int ტიპის ცვლადების შემთხვევაში, როდესაც ნიშნის შესანახად ცალკე ბიტი არაა გამოყოფილი, არამედ შემუშავებულია შენახვის სპეციალური მექანიზმი, რომელიც გამორიცხავს 2 ცალი 0-იანის არსებობას. იმისათვის, რომ int ცვლადს შევუცვალოთ ნიშანი უნდა შევაბრუნოთ ბიტები და დავუმატოთ 1. სწორედ ამ თვისებას იყენებს მოდულის გამოთვლის ფუნქციის მოდიფიცირებული ვარიანტი:

int abs( int value ) {
        const int mask = value >> (sizeof(int)<<3-1);
        return (value^mask) - mask;
}

        mask-მა შეიძლება მიიღოს მნიშვნელობა 0, როდესაც value არის დადებითი რაც შემდგომი ოპერაციის შემდეგ დააბრუნებს იგივე მნიშვნელობას და ასევე შეიძლება მიიღოს მნიშვნელობა -1(რაც ნიშნიანი ჩაწერის ფორმით გვაძლევს 1-იანებს ყველა ბიტში) , რომლის შემდეგაც XOR ოპერაცია mask-ზე გამოიწვევს ბიტურ ინვერსს ხოლო mask-ის გამოკლება გამოიწვევს 1-იანის დამატებას. 

Comments

  1. ra enazea es? sizeof(int) tu 2 ia(ishviati shemtxveva) undefined behaviour ikneba C/C++ ze. http://stackoverflow.com/questions/7401888/why-doesnt-left-bit-shift-for-32-bit-integers-work-as-expected-when-used

    ReplyDelete
    Replies
    1. (sizeof(int)<<3-1) მოგვცემს 15 როცა int-ის ზომა 2ია და 31-ს როცა 4-ია.
      ეს არის უბრალოდ იმისთვის რომ ბოლო ბიტს მივწვდეთ. პრობლემა რომელიც შენ დალინზე ხდება როდესაც წაძვრას ტიპის სიგრძეზე მეტად აკეთებ და არ იცი გარედან 0-ს შემოიტანს თუ 1-ს. მაგ დროს თავი უნდა დაიზღვიო ხოლმე.
      ნებისმიერ შემთხვევაში აქ არის კონცეპტი ნაჩვენები ამ მიდგომის.

      Delete

Post a Comment

Popular posts from this blog

რუსული რულეტკის მეთოდი

Russian Roulette Technique რუსული რულეტკის მეთოდი არის ფართოდ გავრცელებული ტექნიკა მონტე-კარლოს ინტეგრირების პროცესის შესაწყვეტად(სახელწოდება მოდის ცნობილი რუსული თამაშიდან). იმის მაგივრად, რომ პროცესი შევწყვითოთ ხისტად, მაგალითად შერჩევების რაოდენობის რაიმე მაქსიმალურ რაოდენობაზე, რუსული რულექტკის მეთოდი გვეხმარება ინტეგრირების პროცესის მიუკერძოვებლად შეწყვეტაში. მთავარი იდეა რუსული რულეტკის მეთოდისა არის ის, რომ რუსული რულეტკა წყვეტს მონტე კარლოს მეთოდს რაიმე არანულოვანი p ალბათობით(ალბათობა შეიზლება შეირჩეს ერთხელ ან მონტე კარლოს მეთოდის ყოველ ბიჯზე სათითაოდ რაიმე მნიშვნელოვნობით) ან აგრძელებს მას და შემდგომი პროცესიდან მიღებულ შედეგს ამრავლებს 1/p - ზე. რადგან რუსული რულეტკის მეთოდი პროცესის შეწყვეტას ახდენს რაიმე არანულოვანი p ალბათობით ყოველთვის რჩება იმის შანსი, რომ პროცესი გაგრძელდეს რაც იმას ნიშნავს, რომ მონტე კარლოს ინტეგრირების პროცესისათვის ნებისმიერი სიღრმე მიღწევადი ხდება. სწორედ ამიტომ ხისტი შეზღუდვით მიღებული მიკერძოება( სისტემატიური შეცდომა ) ქრება რუსული რ...

ფერების RGB მოდელი

RGB Color Model         ფერების RGB მოდელი წარმოადგენს ისეთ მოდელს რომელშიც სამი ძრირითადი ფერის წითელი, მწვანე და ლურჯის საშუალებით მიიღება ფერების ფართო სპექტრი. მისი დასახელებაც მოდის სწორედ ძირითადი ფერების ინგლისური სახელწოდების ინიციალებიდან(Red, Green, Blue).         ფერთა სპექტრის ამდაგვარი წარმოდგენა დაკავშირებულია იმასთან, რომ გამოსახულების გამოტანის მოწყობილობებში რომელიც გააჩნიათ კომპიუტერებს, ტელევიზორებს ფერის მიღება ფიზიკურად ხდება სწორედ ამ სამი ძირითადი ფერის შეზავებით. დღესდღეობით ყველაზე გავრცელებული არის 24 ბიტიანი RGB მოდელი, სადაც თითოეულ კომპონენტს ეთმობა ერთი ბაიტი და შესაბამისად შეუძლია მიიღოს ნებისმიერი მნიშვნელობა [0, 255] დიაპაზონში, რაც საბოლოოდ გვაძლევს 16777216 განსხვავებულ ფერს.

CPU GPU და ჰიბრიდული რენდერერები

წყარო         დღემდე აქტუალურია თემა CPU რენდერერი ჯობია თუ GPU . იმისათვის რომ ამ კითხვას მეტნაკლებად ამომწურავი პასუხი გავცეთ განვიხილოთ რენდერერის სტრუქტურა და მოცემულ პლათფორმებზე იპმლემენტაციასთან დაკავშირებული პრობლემები. რენდერერი შედგება რამოდენიმე დიდი კომპონენტისგან როგორიცაა ხილვადობის ამოცანა შეფერადება ინტეგრატორები ფუნქციონალი ხილვადობის ამოცანა         ხილვადობის ამოცანა ერთერთი ყველაზე რთულია გამოთვლითი რესურსის კუთხით. გარდა იმისა, რომ სხივის გეომეტრიასთან თანაკვეთის დათვლას საკმაოდ დიდი დრო ჭირდება, ასევე საჭიროა ამაჩქარებელ სტრუქტურების განახლება კადრიდან კადრზე დინამიური სცენებისათვის. კარგი ისაა, რომ რენდერერის ეს ნაწილი საკმაოდ ადვილად ენკაპსულირებადია და შესაბამისად გვხვდება ბიბლიოთეკები მაგალითად embree(intel), fireRays(AMD), OptiX prime(nvidia), ... რომლებიც ამ ამოცანას საკმაოდ ეფექტურად ხსნიან და რენდერერებშიც მეტნაკლებად ადვილად ინტეგრირდებიან.  სხივების მიდევნების პროცესში ძალიან მნიშვნელოვანია მსგ...