On Tue, Oct 4, 2011 at 6:59 PM, Shiyuan <span dir="ltr">&lt;<a href="mailto:gshy2014@gmail.com">gshy2014@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<pre><div class="im"><i><br></i>&gt;<i>  Are you using the PETSc makefiles to compile it? Or did you make up that<br></i>&gt;<i> compile line yourself? Why not just use the PETSc makefile to compile it?<br><br><br><br></i></div>
Actually, the compiling command I usedd is generated by <br>
PETSs&#39;s makefiles.<i> </i>But I am looking for something like &quot;make  getincludedirs; make getpetscflags;<br>make getlinklibs&quot; which can give me the compiling flags Petsc uses to feed nvcc. Are there anything<br>

like that?<div class="im"><br><i><br><br></i>&gt;<i><br></i>&gt;<i>  Presumably cusp/thrust has some pattern for what include files need to be<br></i>&gt;<i> included in what order. If you do not know the pattern then why not start by<br>

</i>&gt;<i> copying what PETSc does, since that compiles? For example<br></i>&gt;<i> cuspvecimpl.h has<br></i>&gt;<i><br></i>&gt;<i> #include &lt;cublas.h&gt;<br></i>&gt;<i> #include &lt;cusp/blas.h&gt;<br></i>&gt;<i> #include &lt;thrust/device_vector.h&gt;<br>

</i>&gt;<i> #include &lt;thrust/iterator/constant_iterator.h&gt;<br></i>&gt;<i> #include &lt;thrust/transform.h&gt;<br></i>&gt;<i> #include &lt;thrust/iterator/permutation_iterator.h&gt;<br></i>&gt;<i><br></i>&gt;<i> while cuspmatimpl.h has<br>

</i>&gt;<i><br></i>&gt;<i> #include &lt;../src/vec/vec/impls/seq/seqcusp/cuspvecimpl.h&gt;<br></i>&gt;<i> #include &lt;cusp/csr_matrix.h&gt;<br></i>&gt;<i> #include &lt;cusp/multiply.h&gt;<br></i>&gt;<i> /*for MatCreateSeqAIJCUSPFromTriple*/<br>

</i>&gt;<i> #include &lt;cusp/coo_matrix.h&gt;<br></i>&gt;<i><br></i>&gt;<i> so start with at least those.   Generally just picking a couple of random<br></i>&gt;<i> include files from some C++ package (like cusp/thrust)  and including them<br>

</i>&gt;</div><i> won&#39;t work.<br><br><br>I did check the documentation of cusp, and I don&#39;t see a requirement about <br></i><i>the order for including headers. It doesn&#39;t sound reasonable to require programmers to enforce the order when the programmers<br>

uses only functions from one library. Does it?( I think there is an issue I don&#39;t see, please excuse me for my ignorance). And I did <br>try a few experiment where I picked some cusp examples and changed the orders of including headers, and they do work. <br>

<br> <br><br><br></i><div class="im">&gt;I believe that your problem is the clash of VecType between CUSP and PETSc.<br>&gt;In <a href="http://aijcusp.cu" target="_blank">aijcusp.cu</a>, we have<br><br>&gt;#undef VecType<br>
&gt;#include &quot;../src/mat/impls/aij/seq/seqcusp/cuspmatimpl.h&quot;<br>
<br> &gt;   Matt<br><br></div>That explains it. But I still don&#39;t get the solution. If I want to define a function where I call some functions provided by Petsc and some functions  provided by cusp and thrust,<br>In what order should I include the headers? For example, if I want Mat, Vec and cusp::krylov::cg.<br>

 If I look at the <a href="http://aijcusp.cu" target="_blank">aijcusp.cu</a> where MatMult_SeqAIJCusp is defined, it has a long list of headers,<br></pre><div style="margin-left:40px"> <br>#include &quot;petscconf.h&quot;<br>
PETSC_CUDA_EXTERN_C_BEGIN<br>
#include &quot;../src/mat/impls/aij/seq/aij.h&quot;          /*I &quot;petscmat.h&quot; I*/<br>#include &quot;petscbt.h&quot;<br>#include &quot;../src/vec/vec/impls/dvecimpl.h&quot;<br>#include &quot;private/vecimpl.h&quot;<br>

PETSC_CUDA_EXTERN_C_END<br>#undef VecType<br>#include &quot;../src/mat/impls/aij/seq/seqcusp/cuspmatimpl.h&quot;<br><br><br>#ifdef PETSC_HAVE_TXPETSCGPU<br><br>#include &quot;csr_matrix_data.h&quot;<br>#include &quot;csr_matrix_data_gpu.h&quot;<br>

#include &quot;csr_tri_solve_gpu.h&quot;<br>#include &quot;csr_tri_solve_gpu_level_scheduler.h&quot;<br>#include &quot;csr_spmv_inode.h&quot;<br>#include &lt;algorithm&gt;<br>#include &lt;vector&gt;<br>#include &lt;string&gt;<br>

#include &lt;thrust/sort.h&gt;<br>#include &lt;thrust/fill.h&gt;<br><br></div><pre><br>But looking at this list of headers, I cannot see what files do I really need and what else is missing if I only want Mat, Vec and cusp::krylov::cg. <br>

Is there a less painful way? Thanks.</pre></blockquote><div>&lt;include PETSc headers&gt;</div><div>#undef VecType</div><div>&lt;include CUSP headers you want&gt;</div><div><br></div><div>   Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<pre><font color="#888888"><br>Shiyuan <br><i></i><i></i><br><br>---------------------------------------------------------------------------------------------------------------------------------------------------------------------</font><div>
<div></div><div class="h5"><br>
<i></i>&gt;<i> On Oct 4, 2011, at 2:07 PM, Shiyuan wrote:<br></i>&gt;<i><br></i>&gt;<i> &gt; Hi,<br></i>&gt;<i> &gt;    I cannot compiling a source file with petsc.h and cusp headers like<br></i>&gt;<i> the following:<br>

</i>&gt;<i> &gt;<br></i>&gt;<i> &gt; #include&quot;petsc.h&quot;<br></i>&gt;<i> &gt; #include&lt;iostream&gt;<br></i>&gt;<i> &gt; #include &quot;cusp/csr_matrix.h&quot;<br></i>&gt;<i> &gt; #include &lt;cusp/krylov/cg.h&gt;<br>

</i>&gt;<i> &gt; int main(void){<br></i>&gt;<i> &gt;     std::cout&lt;&lt;&quot;Hello World!&quot;&lt;&lt;std::endl;<br></i>&gt;<i> &gt;     return 0;<br></i>&gt;<i> &gt; }<br></i>&gt;<i> &gt;<br></i>&gt;<i> &gt; I use the following  to compile it:<br>

</i>&gt;<i> &gt;<br></i>&gt;<i> &gt; nvcc  -m64 -O -arch=sm_13  -c --compiler-options=&quot;-Wall -Wwrite-strings<br></i>&gt;<i> -Wno-strict-aliasing -Wno-unknown-pragmas -O<br></i>&gt;<i> -I/home/guest/sgu1/softwares/petsc-dev/include<br>

</i>&gt;<i> -I/home/guest/sgu1/softwares/petsc-dev/helena-cxx-nompi-os64-release/include<br></i>&gt;<i> -I/usr/local/cuda/include -I/home/guest/sgu1/softwares/cusp-library/<br></i>&gt;<i> -I/home/guest/sgu1/softwares/thrust/<br>

</i>&gt;<i> -I/home/guest/sgu1/softwares/petsc-dev/include/mpiuni  -DCUDA=1<br></i>&gt;<i> -I/home/guest/sgu1/softwares/slepc-dev<br></i>&gt;<i> -I/home/guest/sgu1/softwares/slepc-dev/helena-cxx-nompi-os64-release/include<br>

</i>&gt;<i> -I/home/guest/sgu1/softwares/slepc-dev/include<br></i>&gt;<i> -I/home/guest/sgu1/softwares/ImageMagick-6.7.2/include/ImageMagick<br></i>&gt;<i>  -D__INSDIR__= -I/home/guest/sgu1/softwares/slepc-dev<br></i>&gt;<i> -I/home/guest/sgu1/softwares/slepc-dev/helena-cxx-nompi-os64-release/include<br>

</i>&gt;<i> -I/home/guest/sgu1/softwares/slepc-dev/include&quot; MyKspTmp4.cu -o MyKspTmp4.o<br></i>&gt;<i> &gt;<br></i>&gt;<i> &gt; and it gives me error:<br></i>&gt;<i> &gt;<br></i>&gt;<i> /usr/local/cuda/include/thrust/detail/device/cuda/detail/b40c/vector_types.h(37):<br>

</i>&gt;<i> error: expected an identifier<br></i>&gt;<i> &gt;<br></i>&gt;<i> &gt; I think I did not do it in a correct way. I took a a look at some of<br></i>&gt;<i> petsc&#39;s .cu files, they usually include a  long list of headers. Can petsc.h<br>

</i>&gt;<i> directly included in a source code with cusp headers? What&#39;s the correct way<br></i>&gt;<i> to do it?  Does the makefile system in petsc provide the command or flags to<br></i>&gt;<i> do that? How can I obtain those flags?<br>

</i>&gt;<i> &gt;<br></i>&gt;<i> &gt; And after I compile it and obtain .o files, can I use g++ to link the .o<br></i>&gt;<i> files with petcs libs and other .o files as usual, i.e.,<br></i>&gt;<i> &gt;     g++ -o $(BIN_DIR)/$@ $(CPPFLAGS) $@.s $(objects) $(PETSC_LIB)<br>

</i>&gt;<i> $(OTHERS)<br></i>&gt;<i> &gt; or I need to do some extra steps and some specific linking flags to do<br></i>&gt;<i> that?<br></i>&gt;<i> &gt; Thanks.<br></i>&gt;<i> &gt;<br></i>&gt;<i> &gt; Shiyuan<br></i>&gt;<i> &gt;<br>

</i>&gt;<i> &gt;<br></i>&gt;<i> &gt;<br></i>&gt;<i><br></i>&gt;<i><br></i></div></div></pre>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>
-- Norbert Wiener<br>