Что касается руководства по CUDA, большая часть данных отправляется на устройство посредством вызова ядра.Интересно, могу ли я в любом случае выполнить Init Data - Process (s) - очистить вид операции в cuda.Вот мой код, который я пробовал, но, похоже, он не работает.
#include <cuda.h>
#include <stdio.h>
#include <cuda_runtime.h>
#define CUDA_CHECK_VALUE(value, a) { \
cudaError_t _m_cudaStatus = value; \
if(_m_cudaStatus != cudaSuccess) { \
printf("Error &s at line %d in file %s\n", \
cudaGetErrorString(_m_cudaStatus), \
__LINE__, __FILE__); \
exit(1); \
} else {printf("Done! - %d\n", a);} }
__constant__
float* data;
__host__ __device__
void initMemory(int size){
CUDA_CHECK_VALUE(cudaMalloc(&data, sizeof(float) * size), 0);
float *ha = new float[size];
for(int i =0; i < size; i++){
ha[i] = i * 1.0f;
}
CUDA_CHECK_VALUE(cudaMemcpyToSymbol(data, ha, sizeof(float) * size, 0, cudaMemcpyHostToDevice), 1);
CUDA_CHECK_VALUE(cudaDeviceSynchronize(), 2);
}
__host__ __device__
void freeMemory(){
CUDA_CHECK_VALUE(cudaDeviceSynchronize(), 3);
cudaFree(data);
}
__global__
void print(int size){
printf("size = %d\n", size);
for(int i = 0; i < size; i++){
printf("data[%d] = %f\n", i, data[i]);
}
}
int main(){
int size = 1024;
initMemory(size);
printf("1\n");
print<<<1, 1>>>(size);
printf("2\n");
cudaDeviceSynchronize();
freeMemory();
printf("3\n");
}
В этом коде я пытаюсь сохранить некоторые данные, инициализированные хостом, один раз, и подготовить процесс ядра к многократному вызову и, наконец, освободить cuda.память методом очистки.Но я не совсем уверен, является ли это правильным способом использования CUDA и как соответствующим образом изменить мой код.