added Verlet scheme and NxN non-bonded functionality
[gromacs.git] / src / gmxlib / cuda_tools / pmalloc_cuda.cu
blobac80122ecdefcbb5c2966f7c01f9888b9be09f81
1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
2  *
3  *
4  *                This source code is part of
5  *
6  *                 G   R   O   M   A   C   S
7  *
8  *          GROningen MAchine for Chemical Simulations
9  *
10  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12  * Copyright (c) 2001-2012, The GROMACS development team,
13  * check out http://www.gromacs.org for more information.
14  *
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License
17  * as published by the Free Software Foundation; either version 2
18  * of the License, or (at your option) any later version.
19  *
20  * If you want to redistribute modifications, please consider that
21  * scientific software is very special. Version control is crucial -
22  * bugs must be traceable. We will be happy to consider code for
23  * inclusion in the official distribution, but derived work must not
24  * be called official GROMACS. Details are found in the README & COPYING
25  * files - if they are missing, get the official version at www.gromacs.org.
26  *
27  * To help us fund GROMACS development, we humbly ask that you cite
28  * the papers on the package - you can find them in the top README file.
29  *
30  * For more info, check our website at http://www.gromacs.org
31  *
32  * And Hey:
33  * Gallium Rubidium Oxygen Manganese Argon Carbon Silicon
34  */
36 #include <stdlib.h>
38 #include "gmx_fatal.h"
40 #include "cudautils.cuh"
41 #include "pmalloc_cuda.h"
43 /*! Allocates nbytes of page-locked memory. 
44  *  This memory should always be freed using pfree (or with the page-locked 
45  *  free functions provied by the CUDA library).
46  */
47 void pmalloc(void **h_ptr, size_t nbytes)
49     cudaError_t stat;
50     char        strbuf[STRLEN];
51     int         flag = cudaHostAllocDefault;
53     if (nbytes == 0)
54     {
55         *h_ptr = NULL;
56         return;
57     }
59     CU_CHECK_PREV_ERR();
61     stat = cudaMallocHost(h_ptr, nbytes, flag);    
62     sprintf(strbuf, "cudaMallocHost of size %d bytes failed", (int)nbytes);
63     CU_RET_ERR(stat, strbuf);  
66 /*! Allocates nbytes of page-locked memory with write-combining. 
67  *  This memory should always be freed using pfree (or with the page-locked 
68  *  free functions provied by the CUDA library).
69  */
70 void pmalloc_wc(void **h_ptr, size_t nbytes)
72     cudaError_t stat;
73     char        strbuf[STRLEN];
74     int         flag = cudaHostAllocDefault || cudaHostAllocWriteCombined;
76     if (nbytes == 0)
77     {
78         *h_ptr = NULL;
79         return;
80     }
82     CU_CHECK_PREV_ERR();
84     stat = cudaMallocHost(h_ptr, nbytes, flag);    
85     sprintf(strbuf, "cudaMallocHost of size %d bytes failed", (int)nbytes);
86     CU_RET_ERR(stat, strbuf);  
89 /*! Frees page locked memory allocated with pmalloc.
90  *  This function can safely be called also with a pointer to a page-locked 
91  *  memory allocated directly with CUDA API calls.
92  */
93 void pfree(void *h_ptr) 
95     cudaError_t stat; 
97     if (h_ptr == NULL)
98     {        
99         return;
100     }
102     CU_CHECK_PREV_ERR();
104     stat = cudaFreeHost(h_ptr);
105     CU_RET_ERR(stat, "cudaFreeHost failed");