неверный ресурс в проекте Windows CUDA - PullRequest
1 голос
/ 16 мая 2011

Я перенес проект cuda из linux в windows (в основном просто добавил несколько определений и typedefs в заголовочный файл). Я использую Visual Studio 2008, и пользовательские правила сборки API CUDA Runtime из SDK. Код c, а не c ++ (и я компилирую / TC не / TP)

У меня проблемы с областью действия, которых у меня не было в Linux. Глобальные переменные в моем заголовочном файле не являются общими для файлов .c и .cu.

Я создал упрощенный проект, и вот весь код:

main.h:

#ifndef MAIN_H
#define MAIN_H

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

cudaEvent_t cudaEventStart;

#if defined __cplusplus
extern "C" void func(void);
#else
extern void func(void);
#endif

#endif

main.c:

#include "main.h"

int main(void)
{
    int iDevice = 0;

    cudaSetDevice(iDevice);
    cudaFree(0);
    cudaGetDevice(&iDevice);
    printf("device: %d\n", iDevice);

    cudaEventCreate(&cudaEventStart);
    printf("create event: %d\n", (int) cudaEventStart);

    func();

    cudaEventDestroy(cudaEventStart);
    printf("destroy event: %d\n", (int) cudaEventStart);

    return cudaThreadExit();
}

kernel.cu:

#include "main.h"

void func()
{
    printf("event in cu: %d\n", (int) cudaEventStart);
}

выход:

device: 0
create event: 44199920
event in cu: 0
event destroy: 441999920

Есть идеи о том, что я здесь делаю неправильно? Как мне изменить настройки, чтобы они работали в Visual Studio? В идеале я хотел бы, чтобы установка работала на нескольких платформах.

CUDA 3.2, GTX 480, 64-битная Win7, 263,06 общие

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Что вы пытаетесь сделать

  1. Не будет работать даже без CUDA - попробуйте переименовать kernel.cu в kernel.c и перекомпилировать. Вы получите ошибку компоновщика, потому что cudaEventStart будет многократно определено - в каждом модуле компиляции (файл .c), который включает его. Вам нужно будет сделать переменную статической и инициализировать ее только в одном модуле компиляции.
  2. Компилируется в CUDA, поскольку в CUDA отсутствует компоновщик, и поэтому код в единицах компиляции, скомпилированных с помощью nvcc (файлы .cu), не может ссылаться на символы в других единицах компиляции. CUDA не поддерживает статические глобальные переменные в настоящее время. В будущем CUDA будет иметь компоновщик, но в настоящее время его нет.

То, что происходит, - то, что каждый модуль компиляции получает свой собственный, не конфликтующий экземпляр cudaEventStart.

Что вы можете сделать, это избавиться от глобальной переменной (сделать ее локальной * в main()), добавить параметры cudaEvent_t в функции, которые должны использовать событие, а затем передать переменную события.

Кстати, во втором посте у вас есть циркуляр #include s ...

0 голосов
/ 17 мая 2011

Я изменил свой упрощенный пример (с успехом), включив файл .cu в заголовок и удалив предварительные объявления функции файла .cu.

main.h:

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

#include "kernel.cu"

cudaEvent_t cudaEventStart;

main.c:

#include "main.h"

int main(void)
{
    int iDevice = 0;

    cudaSetDevice(iDevice);
    cudaFree(0);
    cudaGetDevice(&iDevice);
    printf("device: %d\n", iDevice);

    cudaEventCreate(&cudaEventStart);
    printf("create event: %d\n", (int) cudaEventStart);

    func();

    cudaEventDestroy(cudaEventStart);
    printf("destroy event: %d\n", (int) cudaEventStart);

    return cudaThreadExit();
}

kernel.cu:

#ifndef KERNEL_CU
#define KERNEL_CU

#include "main.h"

void func(void);

void func()
{
    printf("event in cu: %d\n", (int) cudaEventStart);
}

#endif

выход:

device: 0
create event: 42784024
event in cu: 42784024
event destroy: 42784024

О том, чтобы посмотреть, работает ли он в моем реальном проекте, и переносимо ли решение обратно в Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...