【发布时间】:2016-12-24 16:26:23
【问题描述】:
我一直在尝试将一些 cuda/C 代码转换为更面向对象的代码,但就我目前对 cuda 功能机制的理解而言,我的目标似乎并不容易实现。在这种情况下,我也找不到很好的解释。毕竟这可能是不可能的。
我有一个 myClass 类的 global 对象,其中包含一个要填充到内核中的数组。
应该如何定义 myClass 中的方法,以便数组和布尔成员对设备可见,然后可以将数组复制回主机?我使用的是cuda 7.5,我的卡的计算能力是3.5。
这是描述情况的暂定结构:
#include <cstdio>
#include <cuda.h>
#include <cuda_runtime.h>
class myClass
{
public:
bool bool_var; // Set from host and readable from device
int data_size; // Set from host
__device__ __host__ myClass();
__device__ __host__ ~myClass();
__host__ void setValues(bool iftrue, int size);
__device__ void dosomething(int device_parameter);
__host__ void export();
// completely unknown methods
__host__ void prepareDeviceObj();
__host__ void retrieveDataToHost();
private:
int *data; // Filled in device, shared between threads, at the end copied back to host for data output
};
__host__ __device__ myClass::myClass()
{
}
__host__ __device__ myClass::~myClass()
{
#ifdef __CUDACC__
if(bool_var)
cudaFree(data);
#else
free(data);
#endif
}
__host__ void myClass::setValues(bool iftrue, int size)
{
bool_var = iftrue;
data_size = size;
}
__device__ void myClass::dosomething(int idx)
{
int toadd = idx+data_size;
atomicAdd(&data[idx], toadd); // data should be unique among threads
}
__global__ void myKernel(myClass obj)
{
const int idx = blockIdx.x*blockDim.x + threadIdx.x;
if(idx < obj.data_size)
{
if(!obj.bool_var)
printf("Object is not up to any task here!");
else
{
printf("Object is ready!");
obj.dosomething(idx);
}
}
}
myClass globalInstance;
int main(int argc, char** argv)
{
int some_number = 40;
globalInstance.setValues(true, some_number);
globalInstance.prepareDeviceObj(); // unknown
myKernel<<<1,some_number>>>(globalInstance); // how to pass the object?
globalInstance.retrieveDataToHost(); // unknown
globalInstance.export();
exit(EXIT_SUCCESS);
}
【问题讨论】: