|
|
|
|
@@ -240,11 +240,17 @@ PIOpenCL::Program * PIOpenCL::Context::createProgram(const PIString & source, co
|
|
|
|
|
if (error) (*error) = "Empty program!";
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
PIString src_text = PRIVATE->complex_src + source;
|
|
|
|
|
const char * csrc = src_text.dataAscii();
|
|
|
|
|
size_t src_size = src_text.size();
|
|
|
|
|
cl_int ret = 0;
|
|
|
|
|
cl_program prog = clCreateProgramWithSource(PRIVATE->context, 1, &csrc, &src_size, &ret);
|
|
|
|
|
static PIString double_ext = "#ifdef cl_khr_fp64\n\
|
|
|
|
|
#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n\
|
|
|
|
|
#elif defined(cl_amd_fp64)\n\
|
|
|
|
|
#pragma OPENCL EXTENSION cl_amd_fp64 : enable\n\
|
|
|
|
|
#else\n\
|
|
|
|
|
#endif\n";
|
|
|
|
|
PIString src_text = PRIVATE->complex_src + double_ext + source;
|
|
|
|
|
const char * csrc = src_text.dataAscii();
|
|
|
|
|
size_t src_size = src_text.size();
|
|
|
|
|
cl_int ret = 0;
|
|
|
|
|
cl_program prog = clCreateProgramWithSource(PRIVATE->context, 1, &csrc, &src_size, &ret);
|
|
|
|
|
if (ret != 0) {
|
|
|
|
|
piCout << "[PIOpenCL::Context]"
|
|
|
|
|
<< "clCreateProgramWithSource error" << ret;
|
|
|
|
|
@@ -429,6 +435,11 @@ void PIOpenCL::Buffer::copyTo(void * data, int elements_count, int elements_offs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void PIOpenCL::Buffer::copyTo(Buffer * buffer, int elements_count, int elements_from_offset, int elements_to_offset) {
|
|
|
|
|
copy(this, buffer, elements_count, elements_from_offset, elements_to_offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void PIOpenCL::Buffer::copyFromContainer() {
|
|
|
|
|
if (!PRIVATE->buffer || !container) return;
|
|
|
|
|
copyFrom(containerData());
|
|
|
|
|
@@ -445,12 +456,12 @@ void PIOpenCL::Buffer::copyFrom(void * data) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void PIOpenCL::Buffer::copyFrom(void * data, int elements_count, int elements_offset) {
|
|
|
|
|
void PIOpenCL::Buffer::copyFrom(void * data, int elements_count, int elements_from_offset) {
|
|
|
|
|
if (!PRIVATE->buffer) return;
|
|
|
|
|
cl_int ret = clEnqueueWriteBuffer(context_->PRIVATEWB->queue,
|
|
|
|
|
PRIVATE->buffer,
|
|
|
|
|
CL_TRUE,
|
|
|
|
|
elements_offset * def.size(),
|
|
|
|
|
elements_from_offset * def.size(),
|
|
|
|
|
elements_count * def.size(),
|
|
|
|
|
data,
|
|
|
|
|
0,
|
|
|
|
|
@@ -463,6 +474,35 @@ void PIOpenCL::Buffer::copyFrom(void * data, int elements_count, int elements_of
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void PIOpenCL::Buffer::copyFrom(Buffer * buffer, int elements_count, int elements_from_offset, int elements_to_offset) {
|
|
|
|
|
copy(buffer, this, elements_count, elements_to_offset, elements_from_offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void PIOpenCL::Buffer::copy(Buffer * buffer_from,
|
|
|
|
|
Buffer * buffer_to,
|
|
|
|
|
int elements_count,
|
|
|
|
|
int elements_from_offset,
|
|
|
|
|
int elements_to_offset) {
|
|
|
|
|
if (!buffer_from || !buffer_to) return;
|
|
|
|
|
if (!buffer_from->PRIVATEWB->buffer || !buffer_to->PRIVATEWB->buffer) return;
|
|
|
|
|
if (elements_count < 0) elements_count = piMini(buffer_from->elements, buffer_to->elements);
|
|
|
|
|
cl_int ret = clEnqueueCopyBuffer(buffer_from->context_->PRIVATEWB->queue,
|
|
|
|
|
buffer_from->PRIVATEWB->buffer,
|
|
|
|
|
buffer_to->PRIVATEWB->buffer,
|
|
|
|
|
elements_from_offset * buffer_from->def.size(),
|
|
|
|
|
elements_to_offset * buffer_to->def.size(),
|
|
|
|
|
elements_count * buffer_from->def.size(),
|
|
|
|
|
0,
|
|
|
|
|
nullptr,
|
|
|
|
|
nullptr);
|
|
|
|
|
if (ret != 0) {
|
|
|
|
|
piCout << "[PIOpenCL::Buffer]"
|
|
|
|
|
<< "clEnqueueCopyBuffer error" << ret;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PIOpenCL::Program::Program() {
|
|
|
|
|
// piCout << "new program" << this;
|
|
|
|
|
zero();
|
|
|
|
|
|