Ошибка компиляции Cuda — ожидаемое основное выражение

эта программа, кажется, в порядке, но я все еще получаю сообщение об ошибке, какое-то предложение?

Программа:

#include "dot.h"
#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    int *a, *b, *c;
    int *dev_a, *dev_b, *dev_c;
    int size = N * sizeof(int);

    cudaMalloc((void**)&dev_a, size);
    cudaMalloc((void**)&dev_b, size);
    cudaMalloc((void**)&dev_c, sizeof(int));

    a = (int *)malloc (size);
    b = (int *)malloc (size);
    c = (int *)malloc (sizeof(int));

    random_ints(a, N);
    random_ints(b, N);

    cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b, size, cudaMemcpyHostToDevice);

    int res = N/THREADS_PER_BLOCK;
    dot<<< res, THREADS_PER_BLOCK >>> (dev_a, dev_b, dev_c);
    //helloWorld<<< dimGrid, dimBlock >>>(d_str);

    cudaMemcpy (c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);

    free(a); free(b); free(c);
    cudaFree(dev_a);
    cudaFree(dev_b);
    cudaFree(dev_c);
    return 0;
}

Ошибка:

DotProductCuda.cpp:27: ошибка: ожидаемое основное выражение перед токеном '<'
DotProductCuda.cpp:27: ошибка: ожидаемое основное выражение перед токеном '>'


person Custodio    schedule 13.05.2011    source источник


Ответы (4)


Синтаксис <<< >>> для вызова ядра не является стандартным C или C++. Эти вызовы должны находиться в файле, скомпилированном компилятором NVCC. Эти файлы обычно имеют расширение .cu. Другие вызовы API к CUDA, такие как cudaMalloc, могут быть в обычных файлах .c или .cpp.

person Steve Fallows    schedule 13.05.2011
comment
Ответьте на мой вопрос о ‹‹››, но теперь я получаю DotProductCuda.cu(26): error: a host function call can not be configured некоторые идеи? - person Custodio; 13.05.2011
comment
Да, вы не объявили точку в качестве ядра для nvcc, поэтому она рассматривает ее как неявно определенную хост-функцию. - person talonmies; 13.05.2011
comment
Я нашел. Я не объявляю точку как глобальный метод. Функции Cuda похожи на __global__ void dot.... - person Custodio; 13.05.2011

Кажется, компилятор не может распознать синтаксис ‹‹‹,>>>. У меня нет опыта работы с CUDA, но я думаю, вам нужно скомпилировать этот файл с помощью специального компилятора, а не обычного компилятора C.

person Christian Rau    schedule 13.05.2011

nvcc использует расширение файла, чтобы определить, как обрабатывать содержимое файла. Если у вас есть синтаксис CUDA внутри файла, он должен иметь расширение .cu, иначе nvcc просто передаст файл нетронутым хост-компилятору, что приведет к синтаксической ошибке, которую вы наблюдаете.

person talonmies    schedule 13.05.2011

Может быть, вы используете хост-функцию (например, printf) внутри ядра?

person amanda    schedule 10.04.2012