hsa_status_t LoaderContext::FindRegion(hsa_region_segment_t segment, hsa_region_t region, void *data) {
  assert(data);

  hsa_status_t hsa_status = HSA_STATUS_SUCCESS;
  bool host = false;

  hsa_status = hsa_region_get_info(
    region, (hsa_region_info_t)HSA_AMD_REGION_INFO_HOST_ACCESSIBLE, &host);
  if (HSA_STATUS_SUCCESS != hsa_status) {
    return hsa_status;
  }

  if (host) {
    hsa_region_segment_t current_segment;
    hsa_status = hsa_region_get_info(region, HSA_REGION_INFO_SEGMENT, &current_segment);
    if (HSA_STATUS_SUCCESS != hsa_status) {
      return hsa_status;
    }
    if (segment == current_segment) {
      *((hsa_region_t*)data) = region;
    }
  }

  return HSA_STATUS_SUCCESS;
}
Пример #2
0
/*
 * Determines if a memory region can be used for kernarg
 * allocations.
 */
static hsa_status_t get_kernarg_memory_region(hsa_region_t region, void* data) {
    hsa_region_segment_t segment;
    hsa_region_get_info(region, HSA_REGION_INFO_SEGMENT, &segment);
    if (HSA_REGION_SEGMENT_GLOBAL != segment) {
        return HSA_STATUS_SUCCESS;
    }

    hsa_region_global_flag_t flags;
    hsa_region_get_info(region, HSA_REGION_INFO_GLOBAL_FLAGS, &flags);
    if (flags & HSA_REGION_GLOBAL_FLAG_KERNARG) {
        hsa_region_t* ret = (hsa_region_t*) data;
        *ret = region;
        return HSA_STATUS_INFO_BREAK;
    }

    return HSA_STATUS_SUCCESS;
}