Я новичок в OpenACC. Мне это очень нравится, поскольку я знаком с OpenMP.
У меня есть 2 карты 1080Ti по 9 ГБ каждая и 128 ГБ оперативной памяти. Я пытаюсь провести очень простой тест, чтобы выделить массив, инициализировать его, а затем суммировать его параллельно. Это работает для 8 ГБ, но когда я увеличиваю до 10 ГБ, я получаю сообщение об ошибке нехватки памяти. Насколько я понял, с объединенной памятью Pascal (которой являются эти карты) и CUDA 8 я мог бы выделить массив, больший, чем память графического процессора, и аппаратное обеспечение будет выгружать и выгружать страницы по запросу.
Вот мой полный тест кода C:
$ cat firstAcc.c
#include <stdio.h>
#include <openacc.h>
#include <stdlib.h>
#define GB 10
int main()
{
float *a;
size_t n = GB*1024*1024*1024/sizeof(float);
size_t s = n * sizeof(float);
a = (float *)malloc(s);
if (!a) { printf("Failed to malloc.\n"); return 1; }
printf("Initializing ... ");
for (int i = 0; i < n; ++i) {
a[i] = 0.1f;
}
printf("done\n");
float sum=0.0;
#pragma acc loop reduction (+:sum)
for (int i = 0; i < n; ++i) {
sum+=a[i];
}
printf("Sum is %f\n", sum);
free(a);
return 0;
}
Согласно разделу «Включение единой памяти» этой статьи Я скомпилирую его с помощью:
$ pgcc -acc -fast -ta=tesla:managed:cuda8 -Minfo firstAcc.c
main:
20, Loop not fused: function call before adjacent loop
Generated vector simd code for the loop
28, Loop not fused: function call before adjacent loop
Generated vector simd code for the loop containing reductions
Generated a prefetch instruction for the loop
Мне нужно понять эти сообщения, но пока я не думаю, что они актуальны. Затем я запускаю его:
$ ./a.out
malloc: call to cuMemAllocManaged returned error 2: Out of memory
Aborted (core dumped)
Это отлично работает, если я изменю GB
на 8. Я ожидал, что 10GB
будет работать (несмотря на карту GPU с 9 ГБ) благодаря Pascal 1080Ti и CUDA 8.
Я неправильно понимаю или что я делаю не так? Заранее спасибо.
$ pgcc -V
pgcc 17.4-0 64-bit target on x86-64 Linux -tp haswell
PGI Compilers and Tools
Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
$ cat /usr/local/cuda-8.0/version.txt
CUDA Version 8.0.61
size_t n = GB*1024*1024*1024/sizeof(float);
Когда я компилирую это с помощью GNU g++ 4.8.2, я получаю предупреждение о целочисленном переполнении. Что произойдет, если вы распечатаетеn
иs
сразу после их назначения? Когда я это делаю, я получаю слишком большие числа. Попробуйте добавитьULL
после всех ваших констант. - person Robert Crovella   schedule 02.05.2017