<div class="gmail_quote">On Fri, Jun 15, 2012 at 12:48 PM, Peter Colberg <span dir="ltr"><<a href="mailto:peter@colberg.org" target="_blank">peter@colberg.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Fri, Jun 15, 2012 at 11:59:59AM -0400, Peter Colberg wrote:<br>
> On Fri, Jun 15, 2012 at 08:31:50AM -0700, Manjunath Kudlur wrote:<br>
> > As Justin mentioned, I don't think the right plumbing exists that uses the<br>
> > frontend support for parsing and lowering the CUDA syntax and connects it<br>
> > to the NVPTX backend. For instance, from the IR, it looks like the kernel<br>
> > function pointer is just cast to i8* and passed to cudaLaunch. cudaLaunch<br>
> > requires the name of the kernel to passed a char string.<br>
><br>
> Definitely not, otherwise my cudaLaunch wrapper would be failing since 2007 ;-).<br>
><br>
> The advantage of the CUDA runtime library, as opposed to the CUDA<br>
> driver library, lies in the convenient execution of kernels.<br>
><br>
> When the nvcc frontend converts the <<< >>> syntax to proper C++ code,<br>
> it does not pass a char string to cudaLaunch, but an actual pointer.<br>
> The only question is how to get that pointer in Clang…<br>
<br>
</div>I have to admit that I never looked at the memory pointed to by a<br>
kernel function pointer, so I did (please tell me if too naïvely…).<br>
<br>
// <a href="http://function.cu" target="_blank">function.cu</a><br>
<br>
__global__ void f(int* array)<br>
{<br>
    array[0] = 42;<br>
}<br>
<br>
int main()<br>
{<br>
    void (*p)(int*) = &f;<br>
    printf("%s\n", reinterpret_cast<char const*>(p));<br>
}<br>
<br>
<br>
nvcc -Xcompiler -Wall -Xptxas -v -o function <a href="http://function.cu" target="_blank">function.cu</a><br>
ptxas info    : Compiling entry function '_Z1fPi' for 'sm_10'<br>
ptxas info    : Used 2 registers, 8+16 bytes smem<br>
<br>
<br>
./function<br>
UH��H��H�}�H�E�H�������UH��SH��(�P@<br>
<br>
So the function pointer to the GPU kernel is indeed not an ASCII string.<br>
<br>
What is it then?<br></blockquote><div><br></div><div>Regardless of how nvcc works under the hood, the point is that Clang is not currently set up to fully support CUDA.  You can invoke it once with -fcuda-is-device and once without to get the IR for both the host and device, but there is not yet a good way to link those together.  The path of least resistance right now is to compile the device code to PTX and then invoke it with the Driver API.  I'm not sure what the maintainer of the CUDA front-end in Clang is planning, you would have to ask him/her when full support is planned.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
Peter<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div><br>