Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6049677
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T07:36:13+00:00 2026-05-23T07:36:13+00:00

I have this c++ project in which I call a cuda kernel by means

  • 0

I have this c++ project in which I call a cuda kernel by means of a wrapper function.

My c++ file looks like this (this is extern.cc):

#include "extern.h"  
#include "qc/operator.h"  
#include "qc/quStates.h"  
#include "gpu.h"  
...  
ROUTINE(ext_bit) {  
    int i;  
    quState *qbit;
    PAR_QUSTATE(q,"q");
    opBit *op;
    tComplex I(0,1);
    tComplex sg= inv ? -1 : 1;
    char c=(def->id())[0];
    if(def->id().length()!=1) c='?';
    switch(c) {
        case 'H': op=new opBit(1,1,1,-1,sqrt(0.5)); break;
        case 'X': op=new opBit(0,1,1,0);        break;
        case 'Y': op=new opBit(0,-I,I,0);       break;
        case 'Z': op=new opBit(1,0,0,-1);       break;
        case 'S': op=new opBit(1,0,0,sg*I);     break;
        case 'T': op=new opBit(1,0,0,sqrt(0.5)+sg*sqrt(0.5)*I); break;
        case '?':
        default: EXTERR("unknown single qubit operator "+def->id());
    } 

    // This is where I call my wrapper function
    // the error that I get is: expected primary-expression before ',' token
    gpucaller(opBit, q);  

    qcl_delete(op);
    return 0;
}

where “gpucaller” is my wrapper function that calls the kernel, both defined in cuda_kernel.cu:

/* compiling with:
nvcc -arch sm_11 -c -I"/home/glu/NVIDIA_GPU_Computing_SDK/C/common/inc" -I"." -I"./qc" -I"/usr/local/cuda/include" -o cuda_kernel.o cuda_kernel.cu
*/


#ifndef _CUDA_KERNEL_H_
#define _CUDA_KERNEL_H_


#define MAX_QUBITS 25
#define BLOCKDIM 512
#define MAX_TERMS_PER_BLOCK (2*BLOCKDIM)
#define THREAD_MASK (~0ul << 1)


// includes
#include <cutil_inline.h>

#include "gpu.h"    


__constant__ float devOpBit[2][2];


__global__ void qcl1(cuFloatComplex *a, int N, int qbCount, int blockGrpSize, int k)
{
    //int idx = blockIdx.x * BLOCKDIM + threadIdx.x;
    //int tx = threadIdx.x;

    cuFloatComplex t0_0, t0_1, t1_0, t1_1;
    int x0_idx, x1_idx;
    int i, grpSize, b0_idx, b1_idx;

    __shared__ cuFloatComplex aS[MAX_TERMS_PER_BLOCK];
    ...
}



void gpucaller(opBit* op, quBaseState* q) {
    // make an operator copy
    float** myOpBit = (float**)op->getDeviceReadyOpBit();

    unsigned int timer = 0;
    cuFloatComplex *a_d;
    long int N = 1 << q->mapbits();
    int size = sizeof(cuFloatComplex) * N;

    // start timer
    cutilCheckError( cutCreateTimer( &timer));
    cutilCheckError( cutStartTimer( timer));    
    // allocate device memory
    cudaMalloc((void**)&a_d,size);  
    // copy host memory to device
    cudaMemcpy(a_d, q->termsarray, size, cudaMemcpyHostToDevice);
    // copy quantic operator to constant memory
    cutilSafeCall( cudaMemcpyToSymbol(devOpBit, myOpBit, 2*sizeof(float[2]), 0) );
    printf("Cuda errors: %s\n", cudaGetErrorString( cudaGetLastError() ) );    

    // setup execution parameters
    dim3 dimBlock(BLOCKDIM, 1, 1);    
    int n_blocks = N/MAX_TERMS_PER_BLOCK + (N%MAX_TERMS_PER_BLOCK == 0 ? 0:1);
    dim3 dimGrid(n_blocks, 1, 1);
    ...        

    // execute the kernel
    qcl1<<< dimGrid, dimBlock >>>(a_d, N, gates, blockGrpSize, k);
    // check if kernel execution generated and error
    cutilCheckMsg("Kernel execution failed");
    ...
    // copy result from device to host
    cudaMemcpy(q->termsarray, a_d, size, cudaMemcpyDeviceToHost);   
    // stop timer
    cutilCheckError( cutStopTimer( timer));
    //printf( "GPU Processing time: %f (ms)\n", cutGetTimerValue( timer));    
    cutilCheckError( cutDeleteTimer( timer));
    // cleanup memory on device
    cudaFree(a_d);
    cudaThreadExit();
}


#endif // #ifndef _CUDA_KERNEL_H_

and “gpu.h” has the following content:

#ifndef _GPU_H_
#define _GPU_H_

#include "qc/operator.h"
#include "qc/qustates.h"

void gpucaller(opBit* op, quBaseState* q);

#endif // #ifndef _GPU_H_

I don’t include the .cu file in my c++ file, I only include the .h file (gpu.h – contains the prototype of my kernel caller function) in both the c++ and the .cu files.

I compile the .cu file with nvcc, and link the resulting .o file in my project’s Makefile.
Also, I didn’t forget to add the “-lcudart” flag to the Makefile.

The problem is that when I compile my main project, I get this error:

expected primary-expression before ',' token

and is referring to the line in extern.cc where I call the “gpucaller” function.

Does anyone know how to get this right?

EDIT: I’ve tried compiling again, this time removing the arguments from the gpucaller‘s function definition (and obviously not passing any arguments to the function, which is wrong because I need to pass arguments). It compiled just fine.

So the problem is that gpucaller‘s argument types aren’t recognized, I have no idea why (I’ve included the headers where the arguments’ types are declared, ie “qc/operator.h” and “qc/quStates.h”). Does anyone have a solution to this?

My project’s Makefile is this:

VERSION=0.6.3

# Directory for Standard .qcl files

QCLDIR = /usr/local/lib/qcl

# Path for qcl binaries

QCLBIN = /usr/local/bin

ARCH = `g++ -dumpmachine || echo bin`

# Comment out if you want to compile for a different target architecture
# To build libqc.a, you will also have to edit qc/Makefile!

#ARCH = i686-linux
#ARCHOPT = -m32 -march=i686

# Debugging and optimization options

#DEBUG = -g -pg -DQCL_DEBUG -DQC_DEBUG
#DEBUG = -g -DQCL_DEBUG -DQC_DEBUG
DEBUG = -O2 -g -DQCL_DEBUG -DQC_DEBUG
#DEBUG = -O2

# Plotting support 
#
# Comment out if you don't have GNU libplotter and X

PLOPT = -DQCL_PLOT
PLLIB = -L/usr/X11/lib -lplotter

# Readline support
#
# Comment out if you don't have GNU readline on your system
# explicit linking against libtermcap or libncurses may be required

RLOPT = -DQCL_USE_READLINE
#RLLIB = -lreadline
RLLIB = -lreadline -lncurses

# Interrupt support
#
# Comment out if your system doesn't support ANSI C signal handling

IRQOPT = -DQCL_IRQ

# Replace with lex and yacc on non-GNU systems (untested)

LEX = flex
YACC = bison 
INSTALL = install

##### You shouldn't have to edit the stuff below #####

DATE = `date +"%y.%m.%d-%H%M"`

QCDIR = qc
QCLIB = $(QCDIR)/libqc.a
QCLINC = lib

#CXX = g++
#CPP = $(CC) -E
CXXFLAGS = -c $(ARCHOPT) -Wall $(DEBUG) $(PLOPT) $(RLOPT) $(IRQOPT) -I$(QCDIR) -DDEF_INCLUDE_PATH="\"$(QCLDIR)\""
LDFLAGS = $(ARCHOPT) -L$(QCDIR) $(DEBUG) $(PLLIB) -lm -lfl -lqc $(RLLIB) -L"/usr/local/cuda/lib" -lcudart

FILESCC = $(wildcard *.cc)
FILESH = $(wildcard *.h)

SOURCE = $(FILESCC) $(FILESH) qcl.lex qcl.y Makefile

OBJECTS = types.o syntax.o typcheck.o symbols.o error.o \
          lex.o yacc.o print.o quheap.o extern.o eval.o exec.o \
          parse.o options.o debug.o cond.o dump.o plot.o format.o cuda_kernel.o

all: do-it-all

ifeq (.depend,$(wildcard .depend))
include .depend
do-it-all: build
else
do-it-all: dep
    $(MAKE)
endif

#### Rules for depend

dep: lex.cc yacc.cc yacc.h $(QCLIB)
    for i in *.cc; do \
      $(CPP) -I$(QCDIR) -MM $$i; \
    done > .depend

lex.cc: qcl.lex yacc.h
    $(LEX) -olex.cc qcl.lex

yacc.cc: qcl.y
    $(YACC) -t -d -o yacc.cc qcl.y

yacc.h: yacc.cc
    mv yacc.*?h yacc.h

$(QCLIB):
    cd $(QCDIR) && $(MAKE) libqc.a

#### Rules for build

build: qcl $(QCLINC)/default.qcl

qcl: $(OBJECTS) qcl.o $(QCLIB)
    $(CXX) $(OBJECTS) qcl.o $(LDFLAGS) -o qcl

$(QCLINC)/default.qcl: extern.cc
    grep "^//!" extern.cc | cut -c5- > $(QCLINC)/default.qcl

checkinst:
    [ -f ./qcl -a -f $(QCLINC)/default.qcl ] || $(MAKE) build

install: checkinst
    $(INSTALL) -m 0755 -d $(QCLBIN) $(QCLDIR)
    $(INSTALL) -m 0755 ./qcl $(QCLBIN)
    $(INSTALL) -m 0644 ./$(QCLINC)/*.qcl $(QCLDIR)

uninstall:
    -rm -f $(QCLBIN)/qcl
    -rm -f $(QCLDIR)/*.qcl
    -rmdir $(QCLDIR)

#### Other Functions

edit:
    nedit $(SOURCE) &

clean:
    rm -f *.o lex.* yacc.* 
    cd $(QCDIR) && $(MAKE) clean

clear: clean
    rm -f qcl $(QCLINC)/default.qcl .depend
    cd $(QCDIR) && $(MAKE) clear

dist-src: dep
    mkdir qcl-$(VERSION)
    cp README CHANGES COPYING .depend $(SOURCE) qcl-$(VERSION) 
    mkdir qcl-$(VERSION)/qc
    cp qc/Makefile qc/*.h qc/*.cc qcl-$(VERSION)/qc
    cp -r lib qcl-$(VERSION)
    tar czf qcl-$(VERSION).tgz --owner=0 --group=0 qcl-$(VERSION)
    rm -r qcl-$(VERSION)

dist-bin: build
    mkdir qcl-$(VERSION)-$(ARCH)
    cp Makefile README CHANGES COPYING qcl qcl-$(VERSION)-$(ARCH) 
    cp -r lib qcl-$(VERSION)-$(ARCH)
    tar czf qcl-$(VERSION)-$(ARCH).tgz --owner=0 --group=0 qcl-$(VERSION)-$(ARCH)
    rm -r qcl-$(VERSION)-$(ARCH)

upload: dist-src
    scp qcl-$(VERSION)*.tgz oemer@tph.tuwien.ac.at:html/tgz

scp: dist-src
    scp qcl-$(VERSION).tgz oemer@tph.tuwien.ac.at:bak/qcl-$(DATE).tgz

The only changes that I’ve added to the original Makefile is adding “cuda_kernel.o” to the OBJECTS’ line, and adding the “-lcudart” flag to LDFLAGS.

UPDATE: Thanks harrism for helping me out. I was passing a type as a parameter.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-23T07:36:13+00:00Added an answer on May 23, 2026 at 7:36 am
    gpucaller(opBit, q);  
    

    You are passing a type name (opBit) as a function parameter, which is not valid C or C++. It looks like you need to do this instead:

    gpucaller(op, q);  
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

We have a class LogManager in our Java project which looks like this: public
I have a django project which is laid out like this... myproject apps media
I have a project called Data which is a data layer. In this project,
This is a simplified task which I have to solve in real project. In
in my project i have one registration form which is developed in C#.net.to this
I have BaseView which implement UIViewController. Every view in project must implement this BaseView.
So I have this project in PHP where I have some include files next
hopefully there's an easy solution to this one. I have my MVC2 project which
I have a project let's call it Yellow.dproj, which I saved as Blue.dproj, to
I have created CMyClass,in which defined one method CallMe().when I build this project MyProject.dll

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.