What Are Virtual Domains?

Virtual domains enable calls to PPU virtual methods and PPU callbacks from the SPU. A virtual domain is a list of functions specified by the programmer and attached to an offload block. This domain tells the compiler to explicitly offload the functions in that list to SPU. If a virtual method or callback is invoked inside this offload block (or the functions it calls), that domain is used to call the correct offloaded method. Failure to attach a correct domain may result in runtime errors (See /kb/77 .html and /kb/78).html.


The following example illustrates the use of domains:


struct dev 
{
virtual void f(){}
virtual void f(int){}
};

void test()
{
__blockingoffload [dev::f] // both overloads dev::f are in the domain
{
ptr->f();
}
__blockingoffload [(void(dev::*)(int)) &dev::f] //offloading f(int) only
{
ptr->f(0);
}
}

A more complex example of a domain declaration is this:


__offload
[
( void (*) (int * ,int __outer * ,test *)) & fptrtest, //offload fptrtest with signature "void(int*,int __outer*, test*)
( void (test::*) (int __outer * , int * ))& test::f,
( void (test::*) (int * , int __outer * )) & test::f,
( void (test::*) (int * , int __outer * )) & test::f this // offload method test::f with signature "void(int*,int __outer*)" with a local (SPU) this pointer
]

A useful command line option to help building the correct domain by inspecting the vcall/callback call-sites is -offloadshowptrcalls (See /kb/82.html) which prints the signature used at the call-sites.


The compiler is able to issue warnings on wrong or incomplete domain declarations in many situations. See /kb/97.html, /kb/98.html, /kb/99.html and /kb/100.html for reference. If any of those warnings occur, the offloaded code is likely to cause the runtime error described in /kb/77 .html and /kb/78.html.


More details and examples on domains can be found in the Offload™ language specification document and the systems manual, both of which are part of the latest Offload™ release.