我想使用 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();
}
我已经__device__ __host__
按照@harrism 的建议尝试了DECL(),但没有效果。
谁能建议如何制作他的作品?(代码不在类中时有效。)