Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
core
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
LibreOffice
core
Commits
c942ed15
Kaydet (Commit)
c942ed15
authored
Ock 02, 2015
tarafından
Kohei Yoshida
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Make these non-inline, for consistency.
Change-Id: I9cc8f18dfa552c9bc12f70b158b0445046e51fd9
üst
a1f2b878
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
85 additions
and
70 deletions
+85
-70
formulagroupcl.cxx
sc/source/core/opencl/formulagroupcl.cxx
+85
-70
No files found.
sc/source/core/opencl/formulagroupcl.cxx
Dosyayı görüntüle @
c942ed15
...
...
@@ -3305,17 +3305,65 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(
class
DynamicKernel
:
public
CompiledFormula
{
public
:
DynamicKernel
(
const
FormulaTreeNodeRef
&
r
,
int
nResultSize
)
:
DynamicKernel
(
const
FormulaTreeNodeRef
&
r
,
int
nResultSize
);
virtual
~
DynamicKernel
();
static
DynamicKernel
*
create
(
ScTokenArray
&
rCode
,
int
nResultSize
);
/// OpenCL code generation
void
CodeGen
();
/// Produce kernel hash
std
::
string
GetMD5
();
/// Create program, build, and create kerenl
/// TODO cache results based on kernel body hash
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void
CreateKernel
();
/// Prepare buffers, marshal them to GPU, and launch the kernel
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void
Launch
(
size_t
nr
);
cl_mem
GetResultBuffer
()
const
{
return
mpResClmem
;
}
private
:
FormulaTreeNodeRef
mpRoot
;
SymbolTable
mSyms
;
std
::
string
mKernelSignature
,
mKernelHash
;
std
::
string
mFullProgramSrc
;
cl_program
mpProgram
;
cl_kernel
mpKernel
;
cl_mem
mpResClmem
;
// Results
std
::
set
<
std
::
string
>
inlineDecl
;
std
::
set
<
std
::
string
>
inlineFun
;
int
mnResultSize
;
};
DynamicKernel
::
DynamicKernel
(
const
FormulaTreeNodeRef
&
r
,
int
nResultSize
)
:
mpRoot
(
r
),
mpProgram
(
NULL
),
mpKernel
(
NULL
),
mpResClmem
(
NULL
),
mnResultSize
(
nResultSize
)
{}
static
DynamicKernel
*
create
(
ScTokenArray
&
rCode
,
int
nResultSize
);
/// OpenCL code generation
void
CodeGen
(
)
DynamicKernel
::~
DynamicKernel
()
{
if
(
mpResClmem
)
{
clReleaseMemObject
(
mpResClmem
);
}
if
(
mpKernel
)
{
clReleaseKernel
(
mpKernel
);
}
// mpProgram is not going to be released here -- it's cached.
}
void
DynamicKernel
::
CodeGen
()
{
// Travese the tree of expression and declare symbols used
const
DynamicKernelArgument
*
DK
=
mSyms
.
DeclRefArg
<
DynamicKernelSoPArguments
>
(
mpRoot
,
new
OpNop
(
mnResultSize
),
mnResultSize
);
...
...
@@ -3358,10 +3406,10 @@ public:
area
<<
"sc.opencl.source."
<<
mKernelSignature
;
SAL_INFO
(
area
.
str
().
c_str
(),
"Program to be compiled:
\n
"
<<
linenumberify
(
mFullProgramSrc
));
#endif
}
/// Produce kernel hash
std
::
string
GetMD5
()
{
}
std
::
string
DynamicKernel
::
GetMD5
()
{
#ifdef MD5_KERNEL
if
(
mKernelHash
.
empty
())
{
...
...
@@ -3382,69 +3430,8 @@ public:
#else
return
""
;
#endif
}
/// Create program, build, and create kerenl
/// TODO cache results based on kernel body hash
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void
CreateKernel
();
/// Prepare buffers, marshal them to GPU, and launch the kernel
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void
Launch
(
size_t
nr
)
{
// Obtain cl context
::
opencl
::
KernelEnv
kEnv
;
::
opencl
::
setKernelEnv
(
&
kEnv
);
cl_int
err
;
// The results
mpResClmem
=
clCreateBuffer
(
kEnv
.
mpkContext
,
(
cl_mem_flags
)
CL_MEM_READ_WRITE
|
CL_MEM_ALLOC_HOST_PTR
,
nr
*
sizeof
(
double
),
NULL
,
&
err
);
if
(
CL_SUCCESS
!=
err
)
throw
OpenCLError
(
err
,
__FILE__
,
__LINE__
);
err
=
clSetKernelArg
(
mpKernel
,
0
,
sizeof
(
cl_mem
),
(
void
*
)
&
mpResClmem
);
if
(
CL_SUCCESS
!=
err
)
throw
OpenCLError
(
err
,
__FILE__
,
__LINE__
);
// The rest of buffers
mSyms
.
Marshal
(
mpKernel
,
nr
,
mpProgram
);
size_t
global_work_size
[]
=
{
nr
};
err
=
clEnqueueNDRangeKernel
(
kEnv
.
mpkCmdQueue
,
mpKernel
,
1
,
NULL
,
global_work_size
,
NULL
,
0
,
NULL
,
NULL
);
if
(
CL_SUCCESS
!=
err
)
throw
OpenCLError
(
err
,
__FILE__
,
__LINE__
);
err
=
clFinish
(
kEnv
.
mpkCmdQueue
);
if
(
CL_SUCCESS
!=
err
)
throw
OpenCLError
(
err
,
__FILE__
,
__LINE__
);
}
virtual
~
DynamicKernel
();
cl_mem
GetResultBuffer
()
const
{
return
mpResClmem
;
}
private
:
FormulaTreeNodeRef
mpRoot
;
SymbolTable
mSyms
;
std
::
string
mKernelSignature
,
mKernelHash
;
std
::
string
mFullProgramSrc
;
cl_program
mpProgram
;
cl_kernel
mpKernel
;
cl_mem
mpResClmem
;
// Results
std
::
set
<
std
::
string
>
inlineDecl
;
std
::
set
<
std
::
string
>
inlineFun
;
int
mnResultSize
;
};
DynamicKernel
::~
DynamicKernel
()
{
if
(
mpResClmem
)
{
clReleaseMemObject
(
mpResClmem
);
}
if
(
mpKernel
)
{
clReleaseKernel
(
mpKernel
);
}
// mpProgram is not going to be released here -- it's cached.
}
/// Build code
void
DynamicKernel
::
CreateKernel
()
{
...
...
@@ -3554,6 +3541,34 @@ void DynamicKernel::CreateKernel()
if
(
err
!=
CL_SUCCESS
)
throw
OpenCLError
(
err
,
__FILE__
,
__LINE__
);
}
void
DynamicKernel
::
Launch
(
size_t
nr
)
{
// Obtain cl context
::
opencl
::
KernelEnv
kEnv
;
::
opencl
::
setKernelEnv
(
&
kEnv
);
cl_int
err
;
// The results
mpResClmem
=
clCreateBuffer
(
kEnv
.
mpkContext
,
(
cl_mem_flags
)
CL_MEM_READ_WRITE
|
CL_MEM_ALLOC_HOST_PTR
,
nr
*
sizeof
(
double
),
NULL
,
&
err
);
if
(
CL_SUCCESS
!=
err
)
throw
OpenCLError
(
err
,
__FILE__
,
__LINE__
);
err
=
clSetKernelArg
(
mpKernel
,
0
,
sizeof
(
cl_mem
),
(
void
*
)
&
mpResClmem
);
if
(
CL_SUCCESS
!=
err
)
throw
OpenCLError
(
err
,
__FILE__
,
__LINE__
);
// The rest of buffers
mSyms
.
Marshal
(
mpKernel
,
nr
,
mpProgram
);
size_t
global_work_size
[]
=
{
nr
};
err
=
clEnqueueNDRangeKernel
(
kEnv
.
mpkCmdQueue
,
mpKernel
,
1
,
NULL
,
global_work_size
,
NULL
,
0
,
NULL
,
NULL
);
if
(
CL_SUCCESS
!=
err
)
throw
OpenCLError
(
err
,
__FILE__
,
__LINE__
);
err
=
clFinish
(
kEnv
.
mpkCmdQueue
);
if
(
CL_SUCCESS
!=
err
)
throw
OpenCLError
(
err
,
__FILE__
,
__LINE__
);
}
// Symbol lookup. If there is no such symbol created, allocate one
// kernel with argument with unique name and return so.
// The template argument T must be a subclass of DynamicKernelArgument
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment