CUDA 3.0 и режим cmake и эмуляции - PullRequest
2 голосов
/ 20 апреля 2010

Я пытаюсь использовать CUDA с cmake (v 2.8) на моем Mac (OSX 10.6). Пока он работает нормально, я создал небольшой образец, чтобы попробовать его (см. Ниже). Однако, когда я включаю режим эмуляции, он больше не может вызвать ядро ​​CUDA, и я получаю следующее сообщение об ошибке:

Ошибка Cuda: вызов ядра: недопустимая функция устройства.

Я также попытался скомпилировать его, вызвав nvcc вручную, и не получил сообщение об ошибке, поэтому я думаю, что это может быть проблемой с cmake.

Я также заметил, что режим эмуляции устарел в CUDA 3.0. Почему это? Nvidia отмечает в своих заметках о выпуске, что они предоставляют Nexus для VS и cuda-gdb для Linux. Но как насчет OSX? Я не смог найти cuda-gdb в версии OSX, которую я установил здесь ..?!

Под файлами

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project (test)

find_package(CUDA)
add_definitions(-Wall)

# Use CUDA emulator?
set(CUDA_BUILD_EMULATION ON)
set(CUDA_64_BIT_DEVICE_CODE OFF)    # Does not work on a Mac currently
set(CMAKE_C_FLAGS -m32)
set(CMAKE_CXX_FLAGS -m32)
set(CUDA_VERBOSE_BUILD ON)

include_directories("${PROJECT_BINARY_DIR}")

cuda_add_executable(test
    test.cu
)

test.cu

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

#include "test_kernel.cu"

void checkCUDAError(const char *msg);

int main( int argc, const char** argv )
{
    int n = 3;
    float* a_h;
    a_h = (float *)malloc(sizeof(float)*n);
    float* a_d;
    cudaMalloc((void**) &a_d, sizeof(float)*n);

    hello<<<1,128>>>(a_d, n);
    checkCUDAError("kernel invocation");
    checkCUDAError("memcpy");

    free(a_h);
    cudaFree(a_d);

    return 0;
}

void checkCUDAError(const char *msg)
{
    cudaError_t err = cudaGetLastError();
    if( cudaSuccess != err)
    {
        fprintf(stderr, "Cuda error: %s: %s.\n", msg,
                cudaGetErrorString( err) );
        exit(EXIT_FAILURE);
    }
}

test_kernel.cu

#include <stdio.h>

__global__ void hello(float*a, int i)
{
    int j = i+1;
#ifdef _DEVICEEMU
    printf("Hello.\n");
#endif
}

1 Ответ

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