P4 to Git Change 1280222 by gandryey@gera-w8 on 2016/06/15 13:17:28

SWDEV-95908 - OpenCL on PAL - cl_amd_offline_devices platform extension
	- Add support for offline devices

Affected files ...

... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldefs.hpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#11 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palkernel.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.cpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.hpp#5 edit
This commit is contained in:
foreman
2016-06-15 13:23:18 -04:00
والد ac02a393c2
کامیت 67d9bc5d63
6فایلهای تغییر یافته به همراه111 افزوده شده و 39 حذف شده
@@ -502,7 +502,7 @@ HSAILProgram::linkImpl(amd::option::Options* options)
// ACL_TYPE_CG stage is not performed for offline compilation
hsa_agent_t agent;
agent.handle = 1;
if (!isNull() && hsaLoad) {
if (hsaLoad) {
executable_ = loader_->CreateExecutable(HSA_PROFILE_FULL, NULL);
if (executable_ == nullptr) {
buildLog_ += "Error: Executable for AMD HSA Code Object isn't created.\n";
@@ -527,7 +527,7 @@ HSAILProgram::linkImpl(amd::option::Options* options)
buildLog_ += "Error: Querying of kernel names size from the binary failed.\n";
return false;
}
if (!isNull() && kernelNamesSize > 0) {
if (kernelNamesSize > 0) {
char* kernelNames = new char[kernelNamesSize];
errorCode = aclQueryInfo(dev().compiler(), binaryElf_, RT_KERNEL_NAMES, nullptr, kernelNames, &kernelNamesSize);
if (errorCode != ACL_SUCCESS) {
@@ -720,7 +720,7 @@ bool ORCAHSALoaderContext::IsaSupportedByAgent(hsa_agent_t agent, hsa_isa_t isa)
// gfx701 only differs from gfx700 by faster fp operations and can be loaded on either device.
return isa.handle == gfx700 || isa.handle == gfx701;
case gfx800:
switch (program_->dev().properties().revision) {
switch (program_->dev().asicRevision()) {
case Pal::AsicRevision::Iceland:
case Pal::AsicRevision::Tonga:
return isa.handle == gfx800;
@@ -735,15 +735,15 @@ bool ORCAHSALoaderContext::IsaSupportedByAgent(hsa_agent_t agent, hsa_isa_t isa)
case Pal::AsicRevision::Stoney:
return isa.handle == gfx810;
default:
assert(0);
assert(0 && "Unknown asic!");
return false;
}
case gfx900:
switch (program_->dev().properties().gfxLevel) {
switch (program_->dev().ipLevel()) {
case Pal::GfxIpLevel::GfxIp9:
return isa.handle == gfx900 || isa.handle == gfx901;
default:
assert(0);
assert(0 && "Unknown asic!");
return false;
}
}
@@ -798,8 +798,10 @@ void* ORCAHSALoaderContext::SegmentAddress(amdgpu_hsa_elf_segment_t segment,
case AMDGPU_HSA_SEGMENT_GLOBAL_PROGRAM:
case AMDGPU_HSA_SEGMENT_GLOBAL_AGENT:
case AMDGPU_HSA_SEGMENT_READONLY_AGENT: {
pal::Memory *gpuMem = reinterpret_cast<pal::Memory*>(seg);
return reinterpret_cast<void*>(gpuMem->vmAddress() + offset);
if (!program_->isNull()) {
pal::Memory *gpuMem = reinterpret_cast<pal::Memory*>(seg);
return reinterpret_cast<void*>(gpuMem->vmAddress() + offset);
}
}
case AMDGPU_HSA_SEGMENT_CODE_AGENT: return (char*) seg + offset;
default:
@@ -874,6 +876,7 @@ void* ORCAHSALoaderContext::CpuMemAlloc(size_t size, size_t align, bool zero) {
assert(size);
assert(align);
assert(sizeof(void*) == 8 || sizeof(void*) == 4);
void* ptr = amd::Os::alignedMalloc(size, align);
if (zero) {
memset(ptr, 0, size);
@@ -896,6 +899,10 @@ void* ORCAHSALoaderContext::GpuMemAlloc(size_t size, size_t align, bool zero) {
assert(size);
assert(align);
assert(sizeof(void*) == 8 || sizeof(void*) == 4);
if (program_->isNull()) {
return new char[size];
}
pal::Memory* mem = new pal::Memory(program_->dev(), amd::alignUp(size, align));
if (!mem || !mem->create(pal::Resource::Local)) {
delete mem;
@@ -918,10 +925,24 @@ bool ORCAHSALoaderContext::GpuMemCopy(void *dst, size_t offset, const void *src,
if (0 == size) {
return true;
}
if (program_->isNull()) {
memcpy(reinterpret_cast<address>(dst) + offset, src, size);
return true;
}
assert(program_->dev().xferQueue());
pal::Memory* mem = reinterpret_cast<pal::Memory*>(dst);
return program_->dev().xferMgr().writeBuffer(src, *mem, amd::Coord3D(offset), amd::Coord3D(size), true);
return true;
}
void ORCAHSALoaderContext::GpuMemFree(void *ptr, size_t size)
{
if (program_->isNull()) {
delete[] reinterpret_cast<char*>(ptr);
}
else {
delete reinterpret_cast<pal::Memory*>(ptr);
}
}
} // namespace pal