P4 to Git Change 1104627 by gandryey@gera-dev-w7 on 2014/12/11 12:01:30

EPR #411058 - [CQE OCL][Lnx][QR][CZ]MultiDevice_Context fails in 2.0 conformance wimpyfull due to CL# 1101352
	- The detection of different map types is overcomplicated with possibility of multiple maps and multithreading environment. Thus keep USWC indirect map optimization based on the allocation flags.

Affected files ...

... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpumemory.cpp#114 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpumemory.hpp#46 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.cpp#342 edit


[ROCm/clr commit: 593d1e3b8d]
Этот коммит содержится в:
foreman
2014-12-11 12:07:05 -05:00
родитель c27a1ebdd5
Коммит 0293e30a65
3 изменённых файлов: 11 добавлений и 21 удалений
+2 -4
Просмотреть файл
@@ -922,8 +922,7 @@ Memory::allocMapTarget(
incIndMapCount();
// If host memory exists, use it
if ((owner()->getHostMem() != NULL) &&
isDirectMap(mapFlags)) {
if ((owner()->getHostMem() != NULL) && isDirectMap()) {
mapAddress = reinterpret_cast<address>(owner()->getHostMem());
}
// If resource is a persistent allocation, we can use it directly
@@ -1248,8 +1247,7 @@ Image::allocMapTarget(
incIndMapCount();
// If host memory exists, use it
if ((owner()->getHostMem() != NULL) &&
isDirectMap(mapFlags)) {
if ((owner()->getHostMem() != NULL) && isDirectMap()) {
useRemoteResource = false;
mapAddress = reinterpret_cast<address>(owner()->getHostMem());
amd::Image* amdImage = owner()->asImage();
+7 -13
Просмотреть файл
@@ -200,20 +200,14 @@ public:
//! Returns the interop resource for this memory object
const Memory* parent() const { return parent_; }
//! Returns TRUE if direct map is acceaptable
//! The method detects forced USWC memory on APU and
//! will cause a switch to indirect map for MAP_READ operations
bool isDirectMap(uint mapFlags)
//! Returns TRUE if direct map is acceaptable. The method detects
//! forced USWC memory on APU and will cause a switch to
//! indirect map for allocations with a possibility of host read
bool isDirectMap()
{
return (((isCacheable() || (owner()->getMemFlags() & CL_MEM_ALLOC_HOST_PTR) ||
!isHostMemDirectAccess() || !(mapFlags & CL_MAP_READ)) &&
// If map(indirect) memory isn't NULL,
// then it's a double map from the app with different map flags.
// If runtime will provide different regions,
// then it won't be able to guarantee coherency
(mapMemory_ == NULL)) ||
// Keep direct map always if the first map was direct already
((indirectMapCount_ > 1) && (mapMemory_ == NULL)));
return (isCacheable() || !isHostMemDirectAccess() ||
(owner()->getMemFlags() &
(CL_MEM_ALLOC_HOST_PTR | CL_MEM_HOST_WRITE_ONLY | CL_MEM_READ_ONLY)));
}
protected:
+2 -4
Просмотреть файл
@@ -1090,8 +1090,7 @@ VirtualGPU::submitMapMemory(amd::MapMemoryCommand& vcmd)
vcmd.mapFlags(), vcmd.isEntireMemory());
// If we have host memory, use it
if ((memory->owner()->getHostMem() != NULL) &&
memory->isDirectMap(vcmd.mapFlags())) {
if ((memory->owner()->getHostMem() != NULL) && memory->isDirectMap()) {
if (!memory->isHostMemDirectAccess()) {
// Make sure GPU finished operation before
// synchronization with the backing store
@@ -1176,8 +1175,7 @@ VirtualGPU::submitUnmapMemory(amd::UnmapMemoryCommand& vcmd)
amd::Memory* owner = memory->owner();
// We used host memory
if ((owner->getHostMem() != NULL) &&
memory->isDirectMap(memory->isUnmapRead() ? CL_MAP_READ : 0)) {
if ((owner->getHostMem() != NULL) && memory->isDirectMap()) {
if (memory->isUnmapWrite()) {
// Target is the backing store, so sync
owner->signalWrite(NULL);