【发布时间】:2019-04-25 23:58:43
【问题描述】:
希望在 CUDA 内核中使用系统函数(例如 rand() )。但是,理想情况下,这只会在 CPU 上运行。我可以分离文件(.cu 和 .c++),同时仍然使用 gpu 矩阵加法吗?例如,大致如下:
在 main.cpp 中:
int main(){
std::vector<int> myVec;
srand(time(NULL));
for (int i = 0; i < 1024; i++){
myvec.push_back( rand()%26);
}
selfSquare(myVec, 1024);
}
在 cudaFuncs.cu 中:
__global__ void selfSquare_cu(int *arr, n){
int i = threadIdx.x;
if (i < n){
arr[i] = arr[i] * arr[i];
}
}
void selfSquare(std::vector<int> arr, int n){
int *cuArr;
cudaMallocManaged(&cuArr, n * sizeof(int));
for (int i = 0; i < n; i++){
cuArr[i] = arr[i];
}
selfSquare_cu<<1, n>>(cuArr, n);
}
围绕此类情况的最佳做法是什么?使用 curand 并在内核中编写所有内容会更好吗?在我看来,就像上面的例子一样,在获取向量并将其复制到共享 cuda 内存中还有一个额外的步骤。
【问题讨论】:
-
沟通越少,通常越好。与来回传输数据相比,可以在 GPU 上以更小的成本完成许多小事情。那么你不应该使用
rand来获取随机数。