PrimitivesClw(CLWContext context) { std::string buildopts = ""; buildopts.append(" -cl-mad-enable -cl-fast-relaxed-math -cl-std=CL1.2 -I . "); bool isamd = context.GetDevice(0).GetVendor().find("AMD") != std::string::npos || context.GetDevice(0).GetVendor().find("Advanced Micro Devices") != std::string::npos; bool has_mediaops = context.GetDevice(0).GetExtensions().find("cl_amd_media_ops2") != std::string::npos; if (isamd) { buildopts.append(" -D AMD "); } if (has_mediaops) { buildopts.append(" -D AMD_MEDIA_OPS "); } buildopts.append( #if defined(__APPLE__) "-D APPLE " #elif defined(_WIN32) || defined (WIN32) "-D WIN32 " #elif defined(__linux__) "-D __linux__ " #else "" #endif ); m_pp = CLWParallelPrimitives(context, buildopts.c_str()); }
CLWProgram CLWProgram::CreateFromSource(char const* sourcecode, size_t sourcesize, CLWContext context) { cl_int status = CL_SUCCESS; cl_program program = clCreateProgramWithSource(context, 1, (const char**)&sourcecode, &sourcesize, &status); ThrowIf(status != CL_SUCCESS, status, "clCreateProgramWithSource failed"); std::vector<cl_device_id> deviceIds(context.GetDeviceCount()); for(unsigned int i = 0; i < context.GetDeviceCount(); ++i) { deviceIds[i] = context.GetDevice(i); } char const* buildopts = #if defined(__APPLE__) "-D APPLE -cl-mad-enable -cl-fast-relaxed-math -cl-std=CL1.2 -I ." #elif defined(_WIN32) || defined (WIN32) "-D WIN32 -cl-mad-enable -cl-std=CL1.2 -I." #elif defined(__linux__) "-D __linux__ -I." #else nullptr #endif ; status = clBuildProgram(program, context.GetDeviceCount(), &deviceIds[0], buildopts, nullptr, nullptr); if(status != CL_SUCCESS) { std::vector<char> buildLog; size_t logSize; clGetProgramBuildInfo(program, deviceIds[0], CL_PROGRAM_BUILD_LOG, 0, nullptr, &logSize); buildLog.resize(logSize); clGetProgramBuildInfo(program, deviceIds[0], CL_PROGRAM_BUILD_LOG, logSize, &buildLog[0], nullptr); #ifdef _DEBUG std::cout << &buildLog[0] << "\n"; #endif throw CLWException(status, std::string(&buildLog[0])); } CLWProgram prg(program); clReleaseProgram(program); return prg; }
CLWProgram CLWProgram::CreateFromSource(char const* sourcecode, size_t sourcesize, char const* buildopts, CLWContext context) { cl_int status = CL_SUCCESS; cl_program program = clCreateProgramWithSource(context, 1, (const char**)&sourcecode, &sourcesize, &status); ThrowIf(status != CL_SUCCESS, status, "clCreateProgramWithSource failed"); std::vector<cl_device_id> deviceIds(context.GetDeviceCount()); for(unsigned int i = 0; i < context.GetDeviceCount(); ++i) { deviceIds[i] = context.GetDevice(i); } status = clBuildProgram(program, context.GetDeviceCount(), &deviceIds[0], buildopts, nullptr, nullptr); if(status != CL_SUCCESS) { std::vector<char> buildLog; size_t logSize; clGetProgramBuildInfo(program, deviceIds[0], CL_PROGRAM_BUILD_LOG, 0, nullptr, &logSize); buildLog.resize(logSize); clGetProgramBuildInfo(program, deviceIds[0], CL_PROGRAM_BUILD_LOG, logSize, &buildLog[0], nullptr); #ifdef _DEBUG std::cout << &buildLog[0] << "\n"; #endif throw CLWException(status, std::string(&buildLog[0])); } CLWProgram prg(program); clReleaseProgram(program); return prg; }