C++ accelerator.cu(8):错误:属性;管理的;这里不适用吗?

C++ accelerator.cu(8):错误:属性;管理的;这里不适用吗?,c++,cuda,gpgpu,C++,Cuda,Gpgpu,我正在编写的程序(Accelerator.cu)将不会在NVCC 8.0.61下编译,并且NVCC-std=c++11-o Accelerator Accelerator.cu。对于为什么\uuuuu设备、\uuuuu全局和\uuuuuu共享失败,还有其他答案,但没有一个在自定义代码中揭示此错误的原因。我正试图遵循指南。但是,在尝试以下代码时: #include <cuda_runtime_api.h> #include <cuda.h> // CUDA Acceler

我正在编写的程序(Accelerator.cu)将不会在NVCC 8.0.61下编译,并且
NVCC-std=c++11-o Accelerator Accelerator.cu
。对于为什么
\uuuuu设备
\uuuuu全局
\uuuuuu共享
失败,还有其他答案,但没有一个在自定义代码中揭示此错误的原因。我正试图遵循指南。但是,在尝试以下代码时:

#include <cuda_runtime_api.h>
#include <cuda.h>

// CUDA Acceleration Adapter.
class Accelerator {
public:
    __device__ __managed__  float**  A;
    __device__ __managed__  float*  B;
    __device__ __managed__  int  N;
    __device__ __managed__  int  C;

    Accelerator () {}

    Accelerator (int N, int C) {
        // initialize variables (unified memory).
        N = records;

        // are "inputs"
        this->C = C;
    }

    void setData (vector<vector<float>>& A, vector<float>& B) {
        // convert vectors to arrays that the GPU can address.
    }

    void accelerate (vector<float>& results) {
        // run kernel.
        // convert results back to vector.
    }

    __global__ void evaluate (float **A, float *B, int N, int C) {
        // do stuff.
    }

};

void main () {
    Accelerator testAcc();
}
其余3个成员变量也有类似的错误


这是我第一次尝试编写自己的GPU加速程序。如果有人知道出了什么问题,我们将非常感谢您的帮助。

您可能会遇到许多问题。我将主要关注一些尝试获取您所展示的要编译的内容的内容,而不会深入研究您可能在这里接触到的CUDA编程的各个方面

您引用的问题(例如,在类成员变量上使用
\uuu device\uu
)是

同样,也不允许使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
(因为它是)。在这样的场景中,您应该使用普通类成员变量,并根据需要动态分配它们,可能在构造函数中,也可能使用动态托管分配器(
cudamalocmanaged
)。使用指针变量作为类成员变量肯定表明了这种方法

您概述的内容可能还有其他挑战。例如,一个
\uuuu全局\uuuu
函数

在CUDA编程方面,您可能有很多需要学习的地方,但这里有一个黑客版本,您所展示的内容没有涉及任何明显的问题:

#include <vector>
using namespace std;
// CUDA Acceleration Adapter.
    __global__ void evaluate (float *a, float *b, int n, int c) {
        for (int i = 0; i < n; i++) a[i]++;
        for (int i = 0; i < c; i++) b[i]++;
    }
class Accelerator {
public:
  float*  A;
  float*  B;
  int  N;
  int  C;

    Accelerator () {}

    Accelerator (int N, int C) {
        // initialize variables (unified memory).
        this->N = N;

        // are "inputs"
        this->C = C;
        cudaMallocManaged(&A, N*sizeof(float));
        cudaMallocManaged(&B, C*sizeof(float));
    }

    void setData (vector<float>& A, vector<float>& B) {
        for (int i=0; i < N; i++) (this->A)[i] = A[i];
        for (int i=0; i < C; i++) (this->B)[i] = B[i];
    }

    void accelerate (vector<float>& results) {
        evaluate<<<1,1>>>(A, B, N, C);
        cudaDeviceSynchronize();
        for (int i = 0; i<N; i++) results[i] = A[i];
    }

};
int  main () {
    Accelerator testAcc(5,3);
}
#包括
使用名称空间std;
//CUDA加速适配器。
__全局无效求值(浮点*a,浮点*b,整数n,整数c){
对于(inti=0;iN=N;
//是“输入”
这个->C=C;
cudaMallocManaged(A,N*sizeof(float));
CudamAllocManager(B、C*sizeof(浮动));
}
无效设置数据(向量和A、向量和B){
对于(inti=0;iA)[i]=A[i];
对于(inti=0;iB)[i]=B[i];
}
无效加速(矢量和结果){
评价(A,B,N,C);
cudaDeviceSynchronize();
对于(int i=0;i
#include <vector>
using namespace std;
// CUDA Acceleration Adapter.
    __global__ void evaluate (float *a, float *b, int n, int c) {
        for (int i = 0; i < n; i++) a[i]++;
        for (int i = 0; i < c; i++) b[i]++;
    }
class Accelerator {
public:
  float*  A;
  float*  B;
  int  N;
  int  C;

    Accelerator () {}

    Accelerator (int N, int C) {
        // initialize variables (unified memory).
        this->N = N;

        // are "inputs"
        this->C = C;
        cudaMallocManaged(&A, N*sizeof(float));
        cudaMallocManaged(&B, C*sizeof(float));
    }

    void setData (vector<float>& A, vector<float>& B) {
        for (int i=0; i < N; i++) (this->A)[i] = A[i];
        for (int i=0; i < C; i++) (this->B)[i] = B[i];
    }

    void accelerate (vector<float>& results) {
        evaluate<<<1,1>>>(A, B, N, C);
        cudaDeviceSynchronize();
        for (int i = 0; i<N; i++) results[i] = A[i];
    }

};
int  main () {
    Accelerator testAcc(5,3);
}