Здесь я представляю код
__constant__ int array[1024];
__global__ void kernel1(int *d_dst) {
int tId = threadIdx.x + blockIdx.x * blockDim.x;
d_dst[tId] = array[tId];
}
__global__ void kernel2(int *d_dst, int *d_src) {
int tId = threadIdx.x + blockIdx.x * blockDim.x;
d_dst[tId] = d_src[tId];
}
int main(int argc, char **argv) {
int *d_array;
int *d_src;
cudaMalloc((void**)&d_array, sizeof(int) * 1024);
cudaMalloc((void**)&d_src, sizeof(int) * 1024);
int *test = new int[1024];
memset(test, 0, sizeof(int) * 1024);
for (int i = 0; i < 1024; i++) {
test[i] = 100;
}
cudaMemcpyToSymbol(array, test, sizeof(int) * 1024);
kernel1<<< 1, 1024 >>>(d_array);
cudaMemcpy(d_src, test, sizeof(int) * 1024, cudaMemcpyHostToDevice);
kernel2<<<1, 32 >>>(d_array, d_src),
free(test);
cudaFree(d_array);
cudaFree(d_src);
return 0;
}
Это просто показывает постоянную память и использование глобальной памяти. При его выполнении "kernel2" выполняется примерно в 4 раза быстрее (с точки зрения времени), чем "kernel1"
Я понимаю из руководства по программированию Cuda C, что это связано с тем, что доступ к постоянной памяти становится сериализованным. Это подводит меня к мысли о том, что постоянную память можно наилучшим образом использовать, если warp обращается к одному постоянному значению, такому как integer, float, double и т.д., Но доступ к массиву вообще не выгоден. Другими словами, я могу сказать, что warp должен получить доступ к одному адресу, чтобы получить выгоду от оптимизации/ускорения от постоянного доступа к памяти. Правильно ли это?
Я также хочу знать, если я сохраняю структуру вместо простого типа в моей постоянной памяти. Любой доступ к структуре потоком с деформацией; также рассматривается как доступ к одной памяти или больше? Я имею в виду, что структура может содержать несколько простых типов и массив, например; при доступе к этим простым типам, эти обращения также сериализованы или нет?
Последний вопрос был бы, если у меня есть массив с постоянными значениями, к которому нужно обращаться через разные потоки в основе; для более быстрого доступа он должен храниться в глобальной памяти вместо постоянной памяти. Это правильно?
Любой может передать мне пример кода, в котором показано эффективное использование постоянной памяти.
С уважением,