60 if (sub.peer_island_index < 0) {
66 if (!
info.has_peer_memory) {
72 if (peer_sub.peer_island_index < 0 &&
73 peer_sub.device->info.type == sub.device->info.type &&
74 peer_sub.device->check_peer_access(sub.device.get()))
76 peer_sub.peer_island_index = sub.peer_island_index;
77 peer_islands[sub.peer_island_index].push_back(&peer_sub);
88 bool have_disabled_hardware_rt =
false;
89 bool have_enabled_hardware_rt =
false;
94 have_enabled_hardware_rt =
true;
97 have_disabled_hardware_rt =
true;
102 info.use_hardware_raytracing = have_enabled_hardware_rt && !have_disabled_hardware_rt;
116 error_msg += sub.device->error_message();
127 BVHLayoutMask device_bvh_layout_mask = sub_device.device->get_bvh_layout_mask(
129 bvh_layout_mask &= device_bvh_layout_mask;
130 bvh_layout_mask_all |= device_bvh_layout_mask;
154 if ((bvh_layout_mask_all & BVH_LAYOUT_OPTIX_EMBREE) == BVH_LAYOUT_OPTIX_EMBREE) {
158 if ((bvh_layout_mask_all & BVH_LAYOUT_METAL_EMBREE) == BVH_LAYOUT_METAL_EMBREE) {
162 if ((bvh_layout_mask_all & BVH_LAYOUT_EMBREEGPU_EMBREE) == BVH_LAYOUT_EMBREEGPU_EMBREE) {
167 if ((bvh_layout_mask_all & BVH_LAYOUT_HIPRT_EMBREE) == BVH_LAYOUT_HIPRT_EMBREE) {
171 return bvh_layout_mask;
177 if (!sub.device->load_kernels(kernel_features)) {
188 if (!sub.device->load_osl_kernels()) {
219 geom_bvhs.reserve(bvh->
geometry.size());
221 geom_bvhs.push_back(std::move(geom->
bvh));
228 for (
size_t k = 0; k < bvh->
geometry.size(); ++k) {
231 static_cast<BVHMulti *
>(geom_bvhs[k].get())->sub_bvhs[
i].get());
277 sub.device->build_bvh(bvh_multi->
sub_bvhs[
i].get(), progress,
refit);
282 for (
size_t k = 0; k < bvh->
geometry.size(); ++k) {
284 bvh->
geometry[k]->bvh = std::move(geom_bvhs[k]);
295 return devices.back().device->get_cpu_osl_memory();
301 if (sub.device.get() == sub_device) {
316 if (island_sub != owner_sub && island_sub->
ptr_map.find(key) != island_sub->ptr_map.end())
318 owner_sub = island_sub;
332 if (key ? (island_sub->ptr_map.find(key) != island_sub->ptr_map.end()) :
333 (island_sub->device->stats.mem_used < owner_sub->
device->stats.mem_used))
335 owner_sub = island_sub;
350 return sub.device->host_alloc(type,
size);
361 sub.device->host_free(type, host_pointer,
size);
381 owner_sub->
device->mem_alloc(mem);
402 owner_sub->
device->mem_copy_to(mem);
408 if (island_sub != owner_sub) {
409 island_sub->device->mem_copy_to(mem);
434 if (!owner_sub->
device->is_shared(
437 owner_sub->
device->mem_move_to_host(mem);
442 if (island_sub != owner_sub) {
443 island_sub->device->mem_move_to_host(mem);
461 if (sub.device.get() == sub_device) {
462 return sub_device->
is_shared(shared_pointer, sub.ptr_map.at(key), sub_device);
466 assert(!
"is_shared failed to find matching device");
471 device_memory &mem,
const size_t y,
size_t w,
const size_t h,
size_t elem)
override
474 const size_t sub_h = h /
devices.size();
478 size_t sy =
y +
i * sub_h;
479 size_t sh = (
i == (size_t)
devices.size() - 1) ? h - sub_h *
i : sub_h;
485 owner_sub->
device->mem_copy_from(mem, sy,
w, sh, elem);
505 owner_sub->
device->mem_zero(mem);
526 owner_sub->
device->mem_free(mem);
532 if (island_sub != owner_sub) {
533 island_sub->device->mem_free(mem);
542 stats.mem_free(existing_size);
548 sub.device->const_copy_to(
name, host,
size);
557 if (sub.device.get() == sub_device) {
569 sub.device->foreach_device(callback);
579 return make_unique<MultiDevice>(info, stats, profiler, headless);
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void refit(btStridingMeshInterface *triangles, const btVector3 &aabbMin, const btVector3 &aabbMax)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
vector< unique_ptr< BVH > > sub_bvhs
static unique_ptr< BVH > create(const BVHParams ¶ms, const vector< Geometry * > &geometry, const vector< Object * > &objects, Device *device)
vector< Geometry * > geometry
vector< Object * > objects
bool use_hardware_raytracing
virtual void host_free(const MemoryType type, void *host_pointer, const size_t size)
virtual bool is_shared(const void *, const device_ptr, Device *)
Device(const DeviceInfo &info_, Stats &stats_, Profiler &profiler_, bool headless_)
friend class device_memory
static unique_ptr< Device > create(const DeviceInfo &info, Stats &stats, Profiler &profiler, bool headless)
virtual void * host_alloc(const MemoryType type, const size_t size)
SubDevice * find_suitable_mem_device(device_ptr key, const vector< SubDevice * > &island)
list< SubDevice > devices
bool is_resident(device_ptr key, Device *sub_device) override
bool load_osl_kernels() override
const string & error_message() override
int device_number(Device *sub_device) override
void verify_hardware_raytracing()
void mem_copy_to(device_memory &mem) override
void mem_free(device_memory &mem) override
void * host_alloc(const MemoryType type, const size_t size) override
vector< vector< SubDevice * > > peer_islands
void mem_zero(device_memory &mem) override
bool is_shared(const void *shared_pointer, const device_ptr key, Device *sub_device) override
void build_bvh(BVH *bvh, Progress &progress, bool refit) override
void const_copy_to(const char *name, void *host, const size_t size) override
BVHLayoutMask get_bvh_layout_mask(const uint kernel_features) const override
void foreach_device(const std::function< void(Device *)> &callback) override
void host_free(const MemoryType type, void *host_pointer, const size_t size) override
MultiDevice(const DeviceInfo &info_, Stats &stats, Profiler &profiler, bool headless)
void mem_alloc(device_memory &mem) override
void mem_copy_from(device_memory &mem, const size_t y, size_t w, const size_t h, size_t elem) override
OSLGlobals * get_cpu_osl_memory() override
bool load_kernels(const uint kernel_features) override
SubDevice * find_matching_mem_device(device_ptr key, SubDevice &sub)
void mem_move_to_host(device_memory &mem) override
device_ptr find_matching_mem(device_ptr key, SubDevice &sub)
device_ptr device_pointer
#define CCL_NAMESPACE_END
unique_ptr< Device > device_multi_create(const DeviceInfo &info, Stats &stats, Profiler &profiler, bool headless)
#define assert(assertion)
@ BVH_LAYOUT_MULTI_HIPRT_EMBREE
@ BVH_LAYOUT_MULTI_EMBREEGPU
@ BVH_LAYOUT_MULTI_METAL_EMBREE
@ BVH_LAYOUT_MULTI_EMBREEGPU_EMBREE
@ BVH_LAYOUT_MULTI_OPTIX_EMBREE
unique_ptr< Device > device
map< device_ptr, device_ptr > ptr_map