CUDA выделение массива массивов

Бонусный ответ: сочетание клавиш в Visual Studio для того, чтобы прокомментировать что-либо Ctrl-KC. Это работает во многих местах, включая C#, VB, JavaScript и aspx страницы; это также работает на SQL в Studio управления SQL.

можно или выбрать текст, который будет прокомментирован, или можно расположить текст в блоке, который будет прокомментирован; например, поместите свой курсор в открывающем тэге GridView, нажмите Ctrl-KC, и все это комментируется.

5
задан 2 December 2009 в 20:21
поделиться

2 ответа

Я не думаю, что это поддерживается. cudaMalloc () выделяет память устройства, но сохраняет адрес в переменной на хосте. В вашем цикле for вы передаете ему адреса в памяти устройства.

В зависимости от того, что вы пытаетесь выполнить, вы можете выделить данных с обычным хостом malloc () перед вызовом цикла for в том виде, в каком он у вас есть. Или выделите один большой блок памяти устройства и вычислите смещения в нем вручную.

См. Разделы 2.4, 3.2.1 и B.2. 5 (внизу) Руководства по программированию CUDA для более подробного обсуждения этого. В частности, внизу страницы 108:

Адрес, полученный путем взятия адреса __ устройства __ , __ общего __ или __ constant __ Переменная может использоваться только в коде устройства.

4
ответ дан 18 December 2019 в 07:54
поделиться

Вы должны выделить указатели в память хоста, затем выделить память устройства для каждого массива и сохранить указатель в памяти хоста. Затем выделите память для хранения указателей в устройстве. а затем скопируйте память хоста в память устройства. Один пример стоит 1000 слов:

__global__ void multi_array_kernel( int N, void** arrays ){
    // stuff
}


int main(){

    const int N_ARRAYS = 20;
    void *h_array = malloc(sizeof(void*) * N_ARRAYS);
    for(int i = 0; i < N_ARRAYS; i++){
        cudaMalloc(&h_array[i], i * sizeof(void*));
        //TODO: check error
    }
    void *d_array = cudaMalloc(sizeof(void*) * N_ARRAYS);

    // Copy to device Memory
    cudaMemcpy(d_array, h_array, sizeof(void*) * N_ARRAYS, cudaMemcpyHostToDevice);

    multi_array_kernel<1,1>(N_ARRAYS, d_array);
    cudaThreadSynchronize();

    for(int i = 0; i < N_ARRAYS; i++){
        cudaFree(h_array[i]); //host not device memory
        //TODO: check error
    }
    cudaFree(d_array);
    free(h_array);
}
11
ответ дан 18 December 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: