Help wanted - programming
- Finding tasks
- Coordinating and submitting your work
- Major projects
- Small and medium-size projects
Help wanted - programming
BOINC always needs volunteers to help with software development. A list of contributors is here.
BOINC consists of several areas, each with some required technical skills:
|Client||C++, system programming|
|Manager||C++, WxWidgets, GUI and graphical design, usability|
|Server programs||C++, system programming, database design, MySQL|
|Web features||HTML, CSS, PHP, web design, usability, database design, MySQL|
|Unix build system||autoconf, automake, other GNU tools|
The University of California holds the copyright on all BOINC source code. By submitting contributions to the BOINC code, you irrevocably assign all right, title, and interest, including copyright and all copyright rights, in such contributions to The Regents of the University of California, who may then use the code for any purpose that it desires.
There are several ways to get tasks to work on:
- Read the list of proposed projects on this page. (Note: please do not add items to this list; suggest new items in the boinc_dev email list.)
- Scan the BOINC bug database for unresolved bugs or feature requests.
- Scan the BOINC message boards for ideas.
Coordinating and submitting your work
Once you pick out a task:
- Look at the source code and think about how you would implement the task.
- Read about the BOINC software and development process.
- Communicate with the area owner or David Anderson, and reach agreement on exactly what you're going to do and how. Don't start coding until you do this.
Submit your work (as diffs or files) to the area owner, so that they can evaluate it and possibly check it in.
Handle heterogeneous GPUs
Currently BOINC requires that all GPUs of a given vendor (NVIDIA, ATI, Intel) be similar, and it treats them as a single pool (i.e. jobs are not associated with a particular GPU instance). This model has a number of drawbacks on machines with multiple different GPUs. Change the model so that each GPU is treated separately. This will require extensive changes to the client, scheduler, and RPC protocol.
Eliminate O(n^2) algorithms
The client's job scheduler has several O(N^2) algorithms, where N is the number of jobs queued on the client. These cause the client to use lots of CPU when N is large (1,000). Change these to Nlog(N).
Automated testing of BOINC
We plan to deploy a Jenkins-based automated test system for BOINC. Help us add unit tests to the BOINC code, and to design end-to-end tests that exercise the entire system under a range of use cases and error conditions.
Accelerating batch completion
Volunteer computing resources are unreliable - computers fail, people uninstall BOINC, and so on. Roughly 5% of jobs fail or time out. This means that in a batch of 10,000 jobs, 500 or so will fail. We retry these (after a delay of a few days) and 25 or so will fail, and so on. Thus is can take quite a long time to finish the entire batch.
This problem can be solved by using more reliable computers to handle retries and jobs at the end of a batch. Doing so, however, is tricky. We have some ideas on how to prioritize batches and prioritize jobs. Complete these designs and implement them.
Improve app version selection
The scheduler's logic for selecting app versions is clumsy. Replace it with logic that, at the start of a request, selects a version for each (app, resource type) and stores these in an array.
Remodel the preferences system
Details are here.
Dynamic deadline adjustment
Currently, when the scheduler sends a job to the client, the job has a fixed deadline. If the job hasn't been completed and reported to the scheduler by then, the server will generate a new instance the job. In some cases this is wasteful. If the client is 90% finished with the job by the deadline, it may be better to let it finish than to create a new instance. The proposal, in general terms:
- Have the client report the status (fraction done and elapsed time) of in-progress jobs.
- Allow the scheduler to extend the deadlines of jobs under some conditions.
Small and medium-size projects
Enhance the BOINC Android GUI
The BOINC Android GUI needs a few enhancements; these are listed here?.
- Document the HTML classes and IDs used by the PHP code. Simplify where possible. Document the "standard" stylesheets, main.css and white.css. Finish black.css, and maybe make another style.
- Change the sample project-specific prefs code (html/project/project_specific.prefs.inc) to use the object-oriented structure used for general prefs (html/inc/prefs.inc).
- Change the prefs code to use simplexml() for XML parsing; simplify the code in general.
- Add a Reset button to prefs (both general and project)
- Add a timezone setting to the user prefs and convert time to this timezone (tricky part is daylight savings time) or use a browser setting (if available) when displaying time.
The following need to be evaluated:
- Change default Q&A page to refer BOINC-specific questions to BOINC web site. #603
- Convert team name HTML and team description to BBcode. #604
- Add new profile features: #609
- list of recent posts and threads this person created, on this and other projects.
- other features from social networking sites, e.g. recent posts by your friends.
- Add ‘referral’ mechanism: new user creates account, enters email of ‘referrer’ (or goes to URL that has it embedded). Give referrer a fraction of credit (or a 1-time bonus). List referrals on user page (show only those still active). Add new referral table to DB.
- Use a WYSIWYG bbcode editor such as http://wysiwygbbcode.codeplex.com/releases/view/49836
- Create Makefiles and project files to build the sample applications using MinGW and Dev-C++.
- Write example FORTRAN application and Makefiles/ project files.
- Investigate the crlibm library for generating identical results across processors (or at least reducing the number of cases for HR).
- Implement a mechanism where the client can ask apps to checkpoint.
- Use modern process-grouping mechanisms (e.g. Unix process groups).
- Keep track of the statistics of how long it takes to upload files, and to report results. Use that info to improve compute deadlines (e.g., subtract the 2 sigma point for both).
- Client monitors total CPU usage, limits its own CPU usage so that total is < 100%.
- Monitor working-set size of non-BOINC apps; don't allow total to exceed physical RAM. This could eliminate the need for memory-usage preferences. Note: this might be tricky because parts of a process's working set is shared with other processes. Some study is needed to figure out the best approach.
- Use multiple disks. This would increase available space, and (if slot dirs spread across disks) would allow I/O-intensive apps to run more efficiently. Would have to remove assumption that project dir is ../../projects/X relative to slot.
- Have the core client sense CPU temperature and throttle CPU if it goes too high. (Code for sensing temperature is already done for Mac.) Open-source software for collecting sensor data (on Linux) is available.
- Windows: get proxy config info directly from the OS.
- Integrate BitTorrent (or libtorrent) with the core client.
- Log result start/ends (for use by 3rd-party software like BoincView).
- Vista: if get 'about to shut down' msg from OS, stop apps immediately (don't tell them to checkpoint). Investigate.
- Check if host is configured to go into Standby mode after X idle minutes. If so, ask user if they want to let BOINC run for X minutes, then go into standby right after that.
- Make it easy for teams to offer a client download that features their skin, and pre-register the user on that team for any projects he attaches to. #610
- Show credit numbers (especially totals) with thousands-groups separators (e.g., commas)
- If using an AMS, put link to AMS (or user page) in sys tray popup, elsewhere.
- Reimplement the BOINC Manager so that it is:
- Configurable via an XML file
- Skinnable via CSS
- nicer-looking than the WxWidgets version
- Show weekly/monthly transfer totals.
- The "select language" dialog should show only languages with translations.
Server and Back End
- Add support for parallel applications: try to schedule all the jobs in a batch more or less simultaneously. NOTE: being done by Volpex project from U. of Houston.
- Implement a mechanism so that server software detects incompatible database format. (related to #715)
- XML stats: add lat/long to user record?