Искал возможность использовать системные функции (такие как rand ()) в ядре CUDA. Однако в идеале это должно работать только на процессоре. Могу ли я разделять файлы (.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.





В этом случае единственное, что вам нужно, - это инициализировать массив случайными значениями. Каждое значение массива может быть инициализировано независимо. ЦП участвует в вашем коде во время инициализации и передачи данных на устройство и обратно на хост.
В вашем случае действительно ли вам нужен ЦП для инициализации данных, чтобы затем перенести все эти значения на ГП?
Наилучший подход - выделить часть памяти устройства, а затем инициализировать значения с помощью ядра. Это сэкономит время, потому что
Как правило, всегда избегайте связи между хостом и устройством, если это возможно.
Чем меньше общения, тем лучше. На графическом процессоре можно делать множество мелких вещей с меньшими затратами, чем передача данных туда и обратно. Тогда вам не следует использовать
randдля получения случайных чисел.