Adding support to hsaKmtMapMemoryToGPUNodes

Change-Id: Iab6222402a43c3cd31b0efc5a316a6482986258e
Signed-off-by: Ben Goz <ben.goz@amd.com>
This commit is contained in:
Ben Goz
2016-01-28 15:33:56 +02:00
bovenliggende 4e6c25e55b
commit 7070f7ec5e
6 gewijzigde bestanden met toevoegingen van 76 en 15 verwijderingen
+15
Bestand weergeven
@@ -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
*/
+2 -2
Bestand weergeven
@@ -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;
};
+2
Bestand weergeven
@@ -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);
+1
Bestand weergeven
@@ -28,6 +28,7 @@ hsaKmtRegisterMemory;
hsaKmtRegisterMemoryToNodes;
hsaKmtDeregisterMemory;
hsaKmtMapMemoryToGPU;
hsaKmtMapMemoryToGPUNodes;
hsaKmtUnmapMemoryToGPU;
hsaKmtDbgRegister;
hsaKmtDbgUnregister;
+32 -13
Bestand weergeven
@@ -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(
+24
Bestand weergeven
@@ -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)
{