2016-08-11 3 views
1

У меня возникла проблема с печатью из ядра pycuda: функция printf() ничего не печатает.printf с помощью PyCUDA (с использованием Kepler GPU)

Этот вопрос был поставлен here по адресу @ username_4567, а также приведенный пример here, на который указывает @harrism в его ответе. Тем не менее, я внедрил код в pycuda example и ничего не печатается (хотя без ошибок). Я предполагаю, что проблема в том, что я использую GPU Kepler, и в этом примере указывается, что он работает только на устройствах Fermi.

Кто-нибудь знает, как я могу печатать информацию из ядер pycuda, используя мой Kepler GPU? Возможно, мне удалось создать рабочий процесс, который копирует любые данные, которые я хочу распечатать на CPU, а затем печатать через Python, но я бы предпочел избежать этого!

Я искал в Интернете для тех, у кого такая же проблема, но я ничего не нашел.

Я использую Python 3.5 (сборка Anaconda), Spyder как IDE (запущен с терминала) и iMac с El Capitan. GPU - GeForce GT 755M.

ответ

2

В коде, который вы пытаетесь использовать, нет ничего плохого, и он идеально подходит для использования на GPU Kepler. Проблема заключается в том, что среда выполнения CUDA использует буфер для вывода printf, который только периодически сбрасывается драйвером и который должен запускаться любым из нескольких вызовов API.

Я предполагаю, что вы тестируете это в интерактивной оболочке python. В этом случае вы должны добавить явный вызов синхронизации к коду:

import pycuda.driver as cuda 
import pycuda.autoinit 
from pycuda.compiler import SourceModule 

mod = SourceModule(""" 
    #include <stdio.h> 

    __global__ void say_hi() 
    { 
     printf("I am %d.%d\\n", threadIdx.x, threadIdx.y); 
    } 
    """) 

func = mod.get_function("say_hi") 
func(block=(4,4,1)) 

# Flush context printf buffer 
cuda.Context.synchronize() 

В качестве альтернативы, если вы добавите хижину строку и запустить неизмененный код из командной строки:

$ cat hello_cuda.py 
#!/usr/bin/env python 
import pycuda.driver as cuda 
import pycuda.autoinit 
from pycuda.compiler import SourceModule 

mod = SourceModule(""" 
    #include <stdio.h> 

    __global__ void say_hi() 
    { 
     printf("I am %d.%d\\n", threadIdx.x, threadIdx.y); 
    } 
    """) 

func = mod.get_function("say_hi") 
func(block=(4,4,1)) 

$ ./hello_cuda.py 
I am 0.0 
I am 1.0 
I am 2.0 
I am 3.0 
I am 0.1 
I am 1.1 
I am 2.1 
I am 3.1 
I am 0.2 
I am 1.2 
I am 2.2 
I am 3.2 
I am 0.3 
I am 1.3 
I am 2.3 
I am 3.3 

он также будет работать , В последнем случае это очистка контекста, вызванная модулем pycuda.autoinit, который автоматически сбрасывает буфер.

+0

привет @talonmies, большое спасибо за то, что нашли время, чтобы ответить. Я запустил первый блок кода выше - пример с применимой строкой cuda.Context.synchronize(), но я все еще ничего не распечатал. Однако, когда я запустил тот же код с терминала, он напечатал из ядра - строки «Я x.y» в вашем втором блоке выше. –

+0

на дальнейшее исследование, что-то странное происходит с моими консолями iPython и Python: если я запустил код примера в оболочке Python (включая «cuda.Context.synchronize()»), он распечатывается как следует. Однако, когда я запускаю его в оболочке iPython, он отправляет вывод в «Ядро 1» (вкладка в окне консоли, а не в оболочке iPython), которая, как я полагаю, связана с оболочкой iPython. Так что это больше похоже на проблему iPython. Если у вас есть еще мысли, я бы с удовольствием их услышал, иначе я переключусь на использование оболочек Python, а не iPython. –

Смежные вопросы