Оператор C ++ new
поддерживается в вычислительных возможностях 2.0 и 2.1 (т. Е. Fermi) с CUDA 4.0, поэтому вы можете использовать new
для выделения глобальной памяти для символа устройства, хотя ни один из ваших первых двух фрагментов кода как это будет сделано на практике.
На старом оборудовании и / или с предыдущими наборами инструментов CUDA 4.0 стандартный подход заключается в использовании API cudaMemcpyToSymbol
в коде хоста:
__device__ float *a;
int main()
{
const size_t sz = 10 * sizeof(float);
float *ah;
cudaMalloc((void **)&ah, sz);
cudaMemcpyToSymbol("a", &ah, sizeof(float *), size_t(0),cudaMemcpyHostToDevice);
}
, который копирует динамически назначенный указатель устройства на символ, который можно использовать непосредственно в коде устройства.
РЕДАКТИРОВАТЬ: Ответ на этот вопрос немного походит на удар по движущейся цели. Для случая постоянной памяти, который вам сейчас интересен, приведем полный рабочий пример:
#include <cstdio>
#define nn (10)
__constant__ float a[nn];
__global__ void kernel(float *out)
{
if (threadIdx.x < nn)
out[threadIdx.x] = a[threadIdx.x];
}
int main()
{
const size_t sz = size_t(nn) * sizeof(float);
const float avals[nn]={ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10. };
float ah[nn];
cudaMemcpyToSymbol("a", &avals[0], sz, size_t(0),cudaMemcpyHostToDevice);
float *ad;
cudaMalloc((void **)&ad, sz);
kernel<<<dim3(1),dim3(16)>>>(ad);
cudaMemcpy(&ah[0],ad,sz,cudaMemcpyDeviceToHost);
for(int i=0; i<nn; i++) {
printf("%d %f\n", i, ah[i]);
}
}
Показывает копирование данных в постоянный символ памяти и использование этих данных внутри ядра.
С другой стороны, межсетевое взаимодействие переполнено хорошо ответившими вопросами, учебными пособиями, конспектами лекций, видео, электронными книгами, образцом кода и документацией по основам программирования CUDA. Пять минут с выбранной вами поисковой системой дадут вам ответы на все вопросы, которые вы задавали в течение последних нескольких дней. Возможно, пришло время сделать именно это.