Adding support to hsaKmtMapMemoryToGPUNodes
Change-Id: Iab6222402a43c3cd31b0efc5a316a6482986258e Signed-off-by: Ben Goz <ben.goz@amd.com>
This commit is contained in:
@@ -416,6 +416,21 @@ hsaKmtMapMemoryToGPU(
|
||||
HSAuint64* AlternateVAGPU //OUT (page-aligned)
|
||||
);
|
||||
|
||||
/**
|
||||
Ensures that the memory is resident and can be accessed by GPUs
|
||||
*/
|
||||
|
||||
HSAKMT_STATUS
|
||||
HSAKMTAPI
|
||||
hsaKmtMapMemoryToGPUNodes(
|
||||
void* MemoryAddress, //IN (page-aligned)
|
||||
HSAuint64 MemorySizeInBytes, //IN (page-aligned)
|
||||
HSAuint64* AlternateVAGPU, //OUT (page-aligned)
|
||||
HsaMemMapFlags MemMapFlags, //IN
|
||||
HSAuint64 NumberOfNodes, //IN
|
||||
HSAuint32* NodeArray //IN
|
||||
);
|
||||
|
||||
/**
|
||||
Releases the residency of the memory
|
||||
*/
|
||||
|
||||
@@ -476,7 +476,7 @@ typedef struct _HsaMemMapFlags
|
||||
struct
|
||||
{
|
||||
unsigned int Reserved1 : 1; //
|
||||
unsigned int CachePolicy : 4; // see HSA_CACHING_TYPE
|
||||
unsigned int CachePolicy : 2; // see HSA_CACHING_TYPE
|
||||
unsigned int ReadOnly : 1; // memory is not modified while mapped
|
||||
// allows migration scale-out
|
||||
unsigned int PageSize : 2; // see HSA_PAGE_SIZE, hint to use
|
||||
@@ -492,7 +492,7 @@ typedef struct _HsaMemMapFlags
|
||||
// may trigger eviction of nonessential
|
||||
// data from the memory, reduces latency
|
||||
// “cleanup hint” only, may be ignored
|
||||
unsigned int Reserved : 21;
|
||||
unsigned int Reserved : 23;
|
||||
};
|
||||
HSAuint32 Value;
|
||||
};
|
||||
|
||||
@@ -63,6 +63,8 @@ HSAKMT_STATUS validate_nodeid(uint32_t nodeid, uint32_t *gpu_id);
|
||||
HSAKMT_STATUS gpuid_to_nodeid(uint32_t gpu_id, uint32_t* node_id);
|
||||
uint16_t get_device_id_by_node(HSAuint32 node_id);
|
||||
uint16_t get_device_id_by_gpu_id(HSAuint32 gpu_id);
|
||||
HSAKMT_STATUS validate_nodeid_array(uint32_t **gpu_id_array,
|
||||
uint32_t NumberOfNodes, uint32_t *NodeArray);
|
||||
|
||||
HSAKMT_STATUS topology_sysfs_get_gpu_id(uint32_t node_id, uint32_t *gpu_id);
|
||||
HSAKMT_STATUS topology_sysfs_get_node_props(uint32_t node_id, HsaNodeProperties *props, uint32_t *gpu_id);
|
||||
|
||||
@@ -28,6 +28,7 @@ hsaKmtRegisterMemory;
|
||||
hsaKmtRegisterMemoryToNodes;
|
||||
hsaKmtDeregisterMemory;
|
||||
hsaKmtMapMemoryToGPU;
|
||||
hsaKmtMapMemoryToGPUNodes;
|
||||
hsaKmtUnmapMemoryToGPU;
|
||||
hsaKmtDbgRegister;
|
||||
hsaKmtDbgUnregister;
|
||||
|
||||
+32
-13
@@ -212,21 +212,10 @@ hsaKmtRegisterMemoryToNodes(
|
||||
{
|
||||
CHECK_KFD_OPEN();
|
||||
uint32_t *gpu_id_array;
|
||||
unsigned i;
|
||||
HSAKMT_STATUS ret = HSAKMT_STATUS_SUCCESS;
|
||||
|
||||
if (NumberOfNodes == 0 || NodeArray == NULL)
|
||||
return HSAKMT_STATUS_INVALID_PARAMETER;
|
||||
|
||||
/* Translate Node IDs to gpu_ids */
|
||||
gpu_id_array = malloc(NumberOfNodes * sizeof(uint32_t));
|
||||
if (gpu_id_array == NULL)
|
||||
return HSAKMT_STATUS_NO_MEMORY;
|
||||
for (i = 0; i < NumberOfNodes; i++) {
|
||||
ret = validate_nodeid(NodeArray[i], &gpu_id_array[i]);
|
||||
if (ret != HSAKMT_STATUS_SUCCESS)
|
||||
break;
|
||||
}
|
||||
ret = validate_nodeid_array(&gpu_id_array,
|
||||
NumberOfNodes, NodeArray);
|
||||
|
||||
if (ret == HSAKMT_STATUS_SUCCESS)
|
||||
ret = fmm_register_memory(MemoryAddress, MemorySizeInBytes,
|
||||
@@ -269,6 +258,36 @@ hsaKmtMapMemoryToGPU(
|
||||
return HSAKMT_STATUS_ERROR;
|
||||
}
|
||||
|
||||
HSAKMT_STATUS
|
||||
HSAKMTAPI
|
||||
hsaKmtMapMemoryToGPUNodes(
|
||||
void* MemoryAddress, //IN (page-aligned)
|
||||
HSAuint64 MemorySizeInBytes, //IN (page-aligned)
|
||||
HSAuint64* AlternateVAGPU, //OUT (page-aligned)
|
||||
HsaMemMapFlags MemMapFlags, //IN
|
||||
HSAuint64 NumberOfNodes, //IN
|
||||
HSAuint32* NodeArray //IN
|
||||
)
|
||||
{
|
||||
uint32_t *gpu_id_array;
|
||||
HSAKMT_STATUS ret;
|
||||
|
||||
ret = validate_nodeid_array(&gpu_id_array,
|
||||
NumberOfNodes, NodeArray);
|
||||
if (ret != HSAKMT_STATUS_SUCCESS) {
|
||||
free(gpu_id_array);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = fmm_register_memory(MemoryAddress, MemorySizeInBytes,
|
||||
gpu_id_array, NumberOfNodes);
|
||||
if (ret != HSAKMT_STATUS_SUCCESS)
|
||||
return ret;
|
||||
|
||||
return fmm_map_to_gpu(MemoryAddress,
|
||||
MemorySizeInBytes, AlternateVAGPU);
|
||||
}
|
||||
|
||||
HSAKMT_STATUS
|
||||
HSAKMTAPI
|
||||
hsaKmtUnmapMemoryToGPU(
|
||||
|
||||
@@ -1317,6 +1317,30 @@ uint16_t get_device_id_by_gpu_id(HSAuint32 gpu_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
HSAKMT_STATUS validate_nodeid_array(uint32_t **gpu_id_array,
|
||||
uint32_t NumberOfNodes, uint32_t *NodeArray)
|
||||
{
|
||||
HSAKMT_STATUS ret;
|
||||
unsigned int i;
|
||||
|
||||
if (NumberOfNodes == 0 || NodeArray == NULL || gpu_id_array == NULL)
|
||||
return HSAKMT_STATUS_INVALID_PARAMETER;
|
||||
|
||||
/* Translate Node IDs to gpu_ids */
|
||||
*gpu_id_array = malloc(NumberOfNodes * sizeof(uint32_t));
|
||||
if (*gpu_id_array == NULL)
|
||||
return HSAKMT_STATUS_NO_MEMORY;
|
||||
for (i = 0; i < NumberOfNodes; i++) {
|
||||
ret = validate_nodeid(NodeArray[i], gpu_id_array[i]);
|
||||
if (ret != HSAKMT_STATUS_SUCCESS) {
|
||||
free(gpu_id_array);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int get_cpu_stepping(uint16_t* stepping)
|
||||
{
|
||||
|
||||
Verwijs in nieuw issue
Block a user