Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
22c28d6b
Commit
22c28d6b
authored
Aug 28, 2009
by
Peter Eastman
Browse files
Implemented PME reciprocal convolution kernel
parent
5ac57f16
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
93 additions
and
0 deletions
+93
-0
platforms/cuda/src/kernels/gpu.cpp
platforms/cuda/src/kernels/gpu.cpp
+58
-0
platforms/cuda/src/kernels/kCalculatePME.cu
platforms/cuda/src/kernels/kCalculatePME.cu
+35
-0
No files found.
platforms/cuda/src/kernels/gpu.cpp
View file @
22c28d6b
...
...
@@ -780,6 +780,64 @@ void gpuSetPMEParameters(gpuContext gpu, float alpha)
gpu
->
sim
.
pPmeParticleIndex
=
gpu
->
psPmeParticleIndex
->
_pDevData
;
gpu
->
psPmeParticleFraction
=
new
CUDAStream
<
float4
>
(
gpu
->
natoms
,
1
,
"PmeParticleFraction"
);
gpu
->
sim
.
pPmeParticleFraction
=
gpu
->
psPmeParticleFraction
->
_pDevData
;
// Initialize the b-spline moduli.
int
maxSize
=
max
(
max
(
gridSize
.
x
,
gridSize
.
y
),
gridSize
.
z
);
vector
<
double
>
data
(
PME_ORDER
);
vector
<
double
>
ddata
(
PME_ORDER
);
vector
<
double
>
bsplines_data
(
maxSize
);
data
[
PME_ORDER
-
1
]
=
0.0
;
data
[
1
]
=
0.0
;
data
[
0
]
=
1.0
;
for
(
int
i
=
3
;
i
<
PME_ORDER
;
i
++
)
{
double
div
=
1.0
/
(
i
-
1.0
);
data
[
i
-
1
]
=
0.0
;
for
(
int
j
=
1
;
j
<
(
i
-
1
);
j
++
)
data
[
i
-
j
-
1
]
=
div
*
(
j
*
data
[
i
-
j
-
2
]
+
(
i
-
j
)
*
data
[
i
-
j
-
1
]);
data
[
0
]
=
div
*
data
[
0
];
}
// Differentiate.
ddata
[
0
]
=
-
data
[
0
];
for
(
int
i
=
1
;
i
<
PME_ORDER
;
i
++
)
ddata
[
i
]
=
data
[
i
-
1
]
-
data
[
i
];
double
div
=
1.0
/
(
PME_ORDER
-
1
);
data
[
PME_ORDER
-
1
]
=
0.0
;
for
(
int
i
=
1
;
i
<
(
PME_ORDER
-
1
);
i
++
)
data
[
PME_ORDER
-
i
-
1
]
=
div
*
(
i
*
data
[
PME_ORDER
-
i
-
2
]
+
(
PME_ORDER
-
i
)
*
data
[
PME_ORDER
-
i
-
1
]);
data
[
0
]
=
div
*
data
[
0
];
for
(
int
i
=
0
;
i
<
maxSize
;
i
++
)
bsplines_data
[
i
]
=
0.0
;
for
(
int
i
=
1
;
i
<=
PME_ORDER
;
i
++
)
bsplines_data
[
i
]
=
data
[
i
-
1
];
// Evaluate the actual bspline moduli for X/Y/Z.
for
(
int
dim
=
0
;
dim
<
3
;
dim
++
)
{
int
ndata
=
(
dim
==
0
?
gridSize
.
x
:
dim
==
1
?
gridSize
.
y
:
gridSize
.
z
);
for
(
int
i
=
0
;
i
<
ndata
;
i
++
)
{
double
sc
=
0.0
;
double
ss
=
0.0
;
for
(
int
j
=
0
;
j
<
ndata
;
j
++
)
{
double
arg
=
(
2.0
*
M_PI
*
i
*
j
)
/
ndata
;
sc
+=
bsplines_data
[
j
]
*
cos
(
arg
);
ss
+=
bsplines_data
[
j
]
*
sin
(
arg
);
}
(
*
gpu
->
psPmeBsplineModuli
[
dim
])[
i
]
=
sc
*
sc
+
ss
*
ss
;
}
for
(
int
i
=
0
;
i
<
ndata
;
i
++
)
{
if
((
*
gpu
->
psPmeBsplineModuli
[
dim
])[
i
]
<
1.0e-7
)
(
*
gpu
->
psPmeBsplineModuli
[
dim
])[
i
]
=
((
*
gpu
->
psPmeBsplineModuli
[
dim
])[
i
-
1
]
+
(
*
gpu
->
psPmeBsplineModuli
[
dim
])[
i
+
1
])
*
0.5
;
}
gpu
->
psPmeBsplineModuli
[
dim
]
->
Upload
();
}
}
extern
"C"
...
...
platforms/cuda/src/kernels/kCalculatePME.cu
View file @
22c28d6b
...
...
@@ -262,6 +262,39 @@ __global__ void kGridSpreadCharge_kernel()
}
}
__global__
void
kReciprocalConvolution_kernel
()
{
const
unsigned
int
gridSize
=
cSim
.
pmeGridSize
.
x
*
cSim
.
pmeGridSize
.
y
*
cSim
.
pmeGridSize
.
z
;
float
expFactor
=
PI
*
PI
/
(
cSim
.
alphaEwald
*
cSim
.
alphaEwald
);
float
scaleFactor
=
1.0
/
(
PI
*
cSim
.
periodicBoxSizeX
*
cSim
.
periodicBoxSizeY
*
cSim
.
periodicBoxSizeZ
);
float
energy
=
0.0
f
;
for
(
int
index
=
blockIdx
.
x
*
blockDim
.
x
+
threadIdx
.
x
;
index
<
gridSize
;
index
+=
blockDim
.
x
*
gridDim
.
x
)
{
int
kx
=
index
/
(
cSim
.
pmeGridSize
.
y
*
cSim
.
pmeGridSize
.
z
);
int
remainder
=
index
-
kx
*
cSim
.
pmeGridSize
.
y
*
cSim
.
pmeGridSize
.
z
;
int
ky
=
remainder
/
cSim
.
pmeGridSize
.
z
;
int
kz
=
remainder
-
ky
*
cSim
.
pmeGridSize
.
z
;
if
(
kx
==
0
&&
ky
==
0
&&
kz
==
0
)
continue
;
int
mx
=
(
kx
<
(
cSim
.
pmeGridSize
.
x
+
1
)
/
2
)
?
kx
:
(
kx
-
cSim
.
pmeGridSize
.
x
);
int
my
=
(
ky
<
(
cSim
.
pmeGridSize
.
y
+
1
)
/
2
)
?
ky
:
(
ky
-
cSim
.
pmeGridSize
.
y
);
int
mz
=
(
kz
<
(
cSim
.
pmeGridSize
.
z
+
1
)
/
2
)
?
kz
:
(
kz
-
cSim
.
pmeGridSize
.
z
);
float
mhx
=
mx
/
cSim
.
periodicBoxSizeX
;
float
mhy
=
my
/
cSim
.
periodicBoxSizeY
;
float
mhz
=
mz
/
cSim
.
periodicBoxSizeZ
;
float
bx
=
cSim
.
pPmeBsplineModuli
[
0
][
kx
];
float
by
=
cSim
.
pPmeBsplineModuli
[
1
][
ky
];
float
bz
=
cSim
.
pPmeBsplineModuli
[
2
][
kz
];
cuComplex
grid
=
cSim
.
pPmeGrid
[
index
];
float
m2
=
mhx
*
mhx
+
mhy
*
mhy
+
mhz
*
mhz
;
float
denom
=
m2
*
bx
*
by
*
bz
;
float
eterm
=
scaleFactor
*
exp
(
-
expFactor
*
m2
)
/
denom
;
cSim
.
pPmeGrid
[
index
]
=
make_cuComplex
(
grid
.
x
*
eterm
,
grid
.
y
*
eterm
);
energy
+=
eterm
*
(
grid
.
x
*
grid
.
x
+
grid
.
y
*
grid
.
y
);
}
cSim
.
pEnergy
[
blockIdx
.
x
*
blockDim
.
x
+
threadIdx
.
x
]
+=
energy
;
}
void
kCalculatePME
(
gpuContext
gpu
)
{
// printf("kCalculatePME\n");
...
...
@@ -272,4 +305,6 @@ void kCalculatePME(gpuContext gpu)
kGridSpreadCharge_kernel
<<<
gpu
->
sim
.
blocks
,
64
,
64
*
(
sizeof
(
float4
)
+
sizeof
(
int4
))
>>>
();
LAUNCHERROR
(
"kUpdateBsplines"
);
cufftExecC2C
(
gpu
->
fftplan
,
gpu
->
psPmeGrid
->
_pDevData
,
gpu
->
psPmeGrid
->
_pDevData
,
CUFFT_FORWARD
);
kReciprocalConvolution_kernel
<<<
gpu
->
sim
.
blocks
,
gpu
->
sim
.
nonbond_threads_per_block
>>>
();
LAUNCHERROR
(
"kUpdateGridIndexAndFraction"
);
}
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