2010-04-20 42 views
2

我想在我的Mac(OSX 10.6)上使用cmake(v 2.8)的CUDA。到目前为止,它工作正常,我创建了一个小样本来试用它(见下文)。但是,当我打开仿真模式时,它无法再调用CUDA内核,并收到以下错误消息:CUDA 3.0和cmake和仿真模式

Cuda错误:内核调用:无效的设备函数。

我也尝试通过手动调用nvcc来编译它,但没有收到错误信息,所以我认为它可能是cmake的一个问题。

我还注意到仿真模式在CUDA 3.0中已弃用。为什么是这样? Nvidia在其发行说明中指出,他们在Linux上提供Nexus for VS和cuda-gdb。但是OSX呢?我在这里安装的OSX版本中找不到cuda-gdb ..?!

下面的文件

的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 
} 
+0

有人吗?想在Linux上尝试一下,但没有Linux和Nvidia硬件的包装盒.. – Nils 2010-04-20 19:12:02

+0

已经在Linux上试过了,同样的问题 – Nils 2010-04-21 09:14:06

回答