Hello,

first of all thank you for putting your time into this.

Given this allocation of a matrix in Python:
    table = numpy.zeros(shape=(100,100))

Given this memory flags:
    mf = cl.mem_flags
    table_buff = cl.Buffer(ctx, mf.READ_WRITE | mf.USE_HOST_PTR, hostbuf = table)

Given this invocation of the method:
    exec_evt = prg.Dijkstra(queue, table.shape, table_buff, Dijkstra_args)
    exec_evt.wait()

It's all but clear to us which identifier should be provided for the first argument. The most "natural" choice would be two asterisks, caused by the fact that a 2D-array is being passed..
So that leads us to:
    __kernel void Dijkstra ( __global float** resistancemap, __global const int* args )

However, when trying to build this code, the following error is shown:
    C:\DOCUME~1\Nick\LOCALS~1\Temp\OCL123.tmp.cl(12): error: kernel must return void; pointer argument must point to addrSpace global, local, or constant
          __kernel void Dijkstra ( __global float** resistancemap, __global const int* args )
                                ^
"kernel must return void": but there is "void" in front of "Dijkstra", isn't it?
"pointer argument must point to addrSpace global, local, or constant": what is causing this? the fact that there are two asterisks? "__global" is clearly present and adding "const" would be plainly wrong, since we flagged table_buff to be READ_WRITEable :-S

With kind regards,

Nick

Andreas Klöckner schreef:
Doesn't build with nvidia CL implementation:

:40: error: subscripted value is neither array nor pointer
                    if (result_distances[x][y] < min_dist && resistancemap[x]
[y] != args[NO_DATA_VALUE]) {
                                                             ^                
~
:52: error: subscripted value is neither array nor pointer
                    if (x >= 0 && y >= 0 && x < n_rows && y < n_cols && 
resistancemap[x][y] != args[NO_DATA_VALUE]) {
                                                                        ^                
~
:54: error: subscripted value is neither array nor pointer
                            alt = result_distances[loc.y][loc.x] + 
resistancemap[x][y]/2 + resistancemap[loc.y][loc.x]/2;
                                                                   ^                
~
:56: error: subscripted value is neither array nor pointer
                            alt = result_distances[loc.y][loc.x] + SQRT_TWO * 
resistancemap[x][y] + SQRT_TWO * resistancemap[loc.y][loc.x];
                                                                              ^                
~
:66: error: subscripted value is neither array nor pointer
            resistancemap[loc.y][loc.x] = args[NO_DATA_VALUE];
            ^                    ~~~~~

Andreas

On Sonntag 18 Oktober 2009, Nick Gaens wrote:
  
Hello all,

we're trying to get a variation on the Dijkstra algorithm to run in
pyOpenCL, but we're getting a weird segmentation fault on the line where
the ALERT comment is located. A print statement before and after this
line indicates this position.

Following is the code that initializes the arrays and stuff and loads
the C code of Dijkstra (located in Dijkstra.cl):

Dijkstra_cl.py:
       ...
        ctx = cl.Context([device])
        queue = cl.CommandQueue(ctx,
properties=cl.command_queue_properties.PROFILING_ENABLE)

        # Contains the resistance map
        table = numpy.zeros(shape=(100,100))

        # Contains the remaining arguments for the Dijkstra call
        # [no_data_value, start_x, start_y, end_x, end_y]
        Dijkstra_args = numpy.ndarray((5,), buffer=numpy.array([-9999,
0, 1, 2, 3]), dtype = numpy.int32)

        # The map 'table' will be read from and written to by the
Dijkstra-method
        mf = cl.mem_flags
        table_buff = cl.Buffer(ctx, mf.READ_WRITE | mf.USE_HOST_PTR,
hostbuf = table)

        Dijkstra_cl_src = ""
        try:
            Dijkstra_cl_file = open("Dijkstra.cl")
            Dijkstra_cl_src = Dijkstra_cl_file.read()
            Dijkstra_cl_file.close()
        except IOError as error:
            print error
        prg = cl.Program(ctx, Dijkstra_cl_src).build()

        exec_evt = prg.Dijkstra(queue, table.shape, table_buff,
Dijkstra_args) # ALERT: segfaults here
        exec_evt.wait()

        elapsed = 1e-9 * (exec_evt.profile.end - exec_evt.profile.start)
        print "Execution time of test: %g s" % elapsed

        c = numpy.empty_like(table)
        cl.enqueue_read_buffer(queue, table, c).wait()

Dijkstra.cl:
        ...
        __kernel void Dijkstra ( __global float* resistancemap, __global
const int* args ) {
                // Dijkstra
                // Remark: the parameter "resistancemap" is read from
and written to, but since we've previously set the READ_WRITE flag, this
should not be a problem or is it?
        }

Can someone point us out what exactly is going wrong? I've attached both
source files in case important information is missing.

A second question is: is it possible to somehow debug the C-code that
you build and run via print-statements or so?
Regarding the second question: what about #include statements in C? The
compiler just says e.g.: "file <math.h> not found" when trying to
regularly including it.

Thx in advance,

Nick

    

  

_______________________________________________ PyOpenCL mailing list [email protected] http://tiker.net/mailman/listinfo/pyopencl_tiker.net
_______________________________________________
PyOpenCL mailing list
[email protected]
http://tiker.net/mailman/listinfo/pyopencl_tiker.net

Reply via email to