如何从包含设备成员变量的类中调用CUDA内核

时间:2013-04-02 09:56:20

标签: cuda gpgpu

我想使用CUDA 5.0链接来编写可重用的CUDA对象。我已经设置了这个简单的测试但是我的内核无声地失败(运行没有错误或异常并输出垃圾)。

我的简单测试(下面)为CUDA设备内存分配一个整数数组。 CUDA内核应该使用顺序条目(0,1,2,....,9)填充数组。设备阵列将复制到CPU内存并输出到控制台。

目前,此代码输出“0,0,0,0,0,0,0,0,0”,而不是所需的“0,1,2,3,4,5,6,7,8” 9,“。它使用VS2010和CUDA 5.0编译(设置了compute_35和sm_35)。使用GeForce 580在Win7-64位上运行。

在Test.h中:

class Test
{
public:
    Test();
    ~Test();
    void Run();
private:
    int* cuArray;
};

在Test.cu中:

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

#include "Test.h"

#define ARRAY_LEN 10


__global__ void kernel(int *p)
{
    int elemID = blockIdx.x * blockDim.x + threadIdx.x;
    p[elemID] = elemID;
}

Test::Test() 
{
    cudaMalloc(&cuArray, ARRAY_LEN * sizeof(int));
}


Test::~Test() 
{
    cudaFree(cuArray);
}


void Test::Run()
{
    kernel<<<1,ARRAY_LEN>>>(cuArray);
    // Copy the array contents to CPU-accessible memory
    int cpuArray[ARRAY_LEN];
    cudaMemcpy(static_cast<void*>(cpuArray), static_cast<void*>(cuArray), ARRAY_LEN * sizeof(int), cudaMemcpyDeviceToHost);

    // Write the array contents to console
    for (int i = 0; i < ARRAY_LEN; ++i)
        printf("%d,", cpuArray[i]);
    printf("\n");
}

在main.cpp中:

#include <iostream>
#include "Test.h"
int main()
{

    Test t;
    t.Run();
}

我按照@harrism的建议尝试了DECL(__device__ __host__),但没有效果。

有谁能建议如何完成他的工作? (当代码不在类中时,代码可以工作。)

1 个答案:

答案 0 :(得分:1)

您使用的设备是GTX 580,其计算能力为2.0。如果为任何大于2.0的体系结构编译代码,内核将无法在您的设备上运行,并且输出将是垃圾。编译用于计算2.0或更低版本的代码,代码运行正常。