我正在编写的程序(Accelerator.cu)将不会使用nvcc -std=c++11 -o accelerator accelerator.cu
在NVCC 8.0.61下编译。其他答案存在__device__
,__global__
和__shared__
失败的原因,但没有一个在自定义代码中显示此错误的原因。我试图遵循指南https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#um-global-scope。但是,在尝试以下代码时:
#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();
}
但是,我收到所有A
accelerator.cu(8): error: attribute "device" does not apply here
accelerator.cu(8): error: attribute "managed" does not apply here
以及其余3个成员变量的类似错误。
这是我第一次尝试编写自己的GPU加速程序。如果有人知道出了什么问题,我们将非常感谢您的帮助。
答案 0 :(得分:1)
你可能会遇到很多问题。我将主要关注那些试图获得你所编写的内容的东西,而不是深入研究你可能会在这里触及的CUDA编程的每个方面。
您引用的问题(例如,__device__
对类成员变量的使用)是explicitly forbidden。
同样禁止__managed__
的使用(因为它是implicitly a __device__
scoped static allocation)。在这样的场景中,您应该使用普通的类成员变量,并根据需要动态分配它们,可能在构造函数中,也许使用动态托管分配器(cudaMallocManaged
)。使用指针变量作为类成员变量肯定表明了这种方法。
您所概述的内容可能还有其他挑战。例如,__global__
函数may not be a class member function。
你可能在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);
}