希望在CUDA内核中使用系统功能(例如rand())。但是,理想情况下,它将仅在CPU上运行。在仍使用gpu矩阵加法的情况下,是否可以分离文件(.cu和.c ++)?例如,遵循以下原则:
在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内存,还有一个额外的步骤。
答案 0 :(得分:2)
在这种情况下,您唯一需要做的就是用随机值初始化数组。数组的每个值都可以单独初始化。 在初始化以及将数据传输到设备然后再传输回主机的过程中,代码中都涉及CPU。
在您的情况下,您是否真的需要让CPU初始化数据以便将所有这些值移至GPU?
最好的方法是分配一些设备内存,然后使用内核初始化值。 这将节省时间,因为
根据经验,始终避免主机与设备之间的通信。