[[PageOutline]] = Applications that use coprocessors = BOINC supports applications that use coprocessors such as GPUs. The BOINC client maintains a list of the coprocessors on the host. It detects NVIDIA, AMD, and Intel GPUs, as well as OpenCL coprocessors. Volunteers can specify other coprocessor types in the [http://boinc.berkeley.edu/wiki/Client_configuration#Options cc_config.xml configuration file] . The client reports coprocessors in scheduler requests; the scheduler tries to send jobs that use available coprocessors. The client keeps track of coprocessor allocation, i.e. which instances of each are free. When it runs a GPU app, it assigns it to a free instance. You can develop your application using any programming system, e.g. CUDA (for NVIDIA), CAL (for ATI) or OpenCL. == Dealing with GPU memory allocation failures == GPUs don't have virtual memory. GPU memory allocations may fail because other applications are using the GPU. This is typically a temporary condition. Rather than exiting with an error in this case, call {{{ boinc_temporary_exit(60); }}} This exits the application and tells the BOINC client to restart it again in at least 60 seconds, at which point memory may be available. == Device selection == Some hosts have multiple GPUs. The BOINC client tells your application which instance to use. Call '''boinc_get_init_data()''' to get an APP_INIT_DATA structure; the device number (0, 1, ...) is in the '''gpu_device_num''' field. Old (pre-7.0.12) clients pass the device number via a command-line argument, '''--device N'''. In this case API_INIT_DATA::gpu_device_num will be -1, and your application must check its command-line args. So to be compatible with all clients, your app should do something like {{{ int device_num; APP_INIT_DATA aid; boinc_get_init_data(aid); if (aid.gpu_device_num >= 0) { device_num = aid.gpu_device_num; } else { device_num = (scan argc/argv for --device argument); } }}} OpenCL apps don't need this; instead, use the '''boinc_get_opencl_ids()''' API as described [http://boinc.berkeley.edu/trac/wiki/OpenclApps here]. == Do GPU kernels within critical sections == The BOINC client may kill your application during execution. If a GPU kernel is in progress at this point, a system crash or hang may occur. To prevent this, do GPU kernels within a critical section, e.g. {{{ boinc_begin_critical_section(); ... do GPU kernel boinc_end_critical_section(); }}} == Plan classes == All GPU applications must use a [AppPlan plan class] to specify their properties. You may be able use one of the predefined plan classes; otherwise you must define your own plan class, using either [AppPlanSpec XML] or [PlanClassFunc C++]. Plan class names for GPU apps must obey these rules: * For OpenCL apps, the name must contain "opencl" * For CUDA apps, the name must contain "cuda" * For CAL apps, the name must contain "ati".