Начало работы с Twitter \ OAuth2 \ Python

Краткая версия:

Основная причина проблемы, когда class A создается вне основного, заключается в том, что определенная процедура подпрограммы, которая требуется для инициализации библиотеки времени выполнения CUDA с вашими ядрами, не является перед тем, как вызывается конструктор class A. Это происходит потому, что нет никаких гарантий относительно порядка, в котором статические объекты создаются и инициализируются в модели выполнения C ++. Ваш глобальный класс видимости создается для объектов глобальной области, которые инициализируются установкой CUDA. Ваш код ядра никогда не загружается в контекст перед его вызовом, и возникает ошибка времени выполнения.

Насколько я могу судить, это подлинное ограничение API-интерфейса CUDA, а не что-то легко фиксированное в коде пользователя. В вашем тривиальном примере вы могли бы заменить вызов ядра вызовом cudaMemset или одной из функций memset API, не основанных на символах, и он будет работать. Эта проблема полностью ограничена ядрами пользователей или символами устройств, загружаемыми во время выполнения через API среды выполнения. По этой причине пустой конструктор по умолчанию также решит вашу проблему. С точки зрения дизайна, я бы очень сомневался в любом шаблоне, который вызывает ядра в конструкторе. Добавление определенного метода для установки / отладки класса GPU, который не полагается на конструктор или деструктор по умолчанию, был бы более чистым и менее подверженным ошибкам дизайном IMHO.

Подробнее:

Существует внутренняя сгенерированная процедура (__cudaRegisterFatBinary), которая должна выполняться для загрузки и регистрации ядер, текстур и статически определенных символов устройства, содержащихся в полезной нагрузке жирного жира любой программы API выполнения во время выполнения с API-интерфейсом CUDA до того, как ядро ​​можно будет вызывать без ошибка. Это часть функции инициализации контекста «ленивого» интерфейса API. Вы можете подтвердить это для себя следующим образом:

Ниже приведен пример gdb пересмотренного примера, который вы опубликовали. Примечание. Я вставляю точку останова в __cudaRegisterFatBinary, и это не достигнуто до того, как вы вызовете статический конструктор A и не запускается запуск ядра:

talonmies@box:~$ gdb a.out 
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/talonmies/a.out...done.
(gdb) break '__cudaRegisterFatBinary' 
Breakpoint 1 at 0x403180
(gdb) run
Starting program: /home/talonmies/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Scalar Field
[New Thread 0x7ffff5a63700 (LWP 10774)]
Class A
Kernel : invalid device function 
[Thread 0x7ffff5a63700 (LWP 10774) exited]
[Inferior 1 (process 10771) exited with code 0377]

Вот такая же процедура, на этот раз с A внутри main (что гарантировано произойдет после того, как объекты, выполняющие ленивую настройку, были инициализированы):

talonmies@box:~$ cat main.cu
#include "classA.h"


int main() {
    A a_object;
    std::cout << "Main" << std::endl;
    return 0;
}

talonmies@box:~$ nvcc --keep -arch=sm_30 -g main.cu
talonmies@box:~$ gdb a.out 
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/talonmies/a.out...done.
(gdb) break '__cudaRegisterFatBinary' 
Breakpoint 1 at 0x403180
(gdb) run
Starting program: /home/talonmies/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, 0x0000000000403180 in __cudaRegisterFatBinary ()
(gdb) cont
Continuing.
Scalar Field
[New Thread 0x7ffff5a63700 (LWP 11084)]
Class A
Main
[Thread 0x7ffff5a63700 (LWP 11084) exited]
[Inferior 1 (process 11081) exited normally]

Если это действительно калечащая проблема для вас, я бы предложил связаться с вами Поддержка разработчиков NVIDIA и отчет об ошибке.

29
задан Jean 31 March 2013 в 16:42
поделиться

2 ответа

Почти все примеры oauth в блогах, кажется, являются примерами фазы авторизации oauth, и ни один из них не фокусируется на том, как на самом деле делать запросы, когда они у вас есть, поскольку, как только вы поймете, как это работает, эта часть совершенно очевидна. Получить первоначальное понимание, к сожалению, довольно сложно.

Если вы просто пытаетесь получить доступ к своей учетной записи Twitter из скрипта или приложения для себя, вы можете получить токен доступа (называемый ключом в библиотеке Python oauth) и секретный ключ на dev.twitter.com по адресу внизу страницы настроек вашего приложения под заголовком Токен доступа .

import oauth2 as oauth
import json

CONSUMER_KEY = "your app's consumer key"
CONSUMER_SECRET = "your app's consumer secret"
ACCESS_KEY = "your access token"
ACCESS_SECRET = "your access token secret"

consumer = oauth.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
access_token = oauth.Token(key=ACCESS_KEY, secret=ACCESS_SECRET)
client = oauth.Client(consumer, access_token)

timeline_endpoint = "https://api.twitter.com/1.1/statuses/home_timeline.json"
response, data = client.request(timeline_endpoint)

tweets = json.loads(data)
for tweet in tweets:
    print tweet['text']

В этом примере используется библиотека python lib python-oauth2 , которая, к сожалению, называется библиотекой OAuth, а не библиотекой OAuth2.

Если вы хотите разрешить другим людям авторизовать их учетную запись для использования вашим приложением, вам нужно реализовать танец перенаправления, где вы просите щебетать пару токен / секретный запрос, а затем перенаправить пользователя на страницу авторизации щебета с помощью Этот токен запроса, они входят и авторизуют токен и перенаправляются обратно в ваше приложение, затем вы обмениваете токен запроса на токен доступа и секретную пару, которые вы можете хранить и использовать для выполнения запросов, как описано выше.

Пример трехстороннего OAuth в Twitter в Readme на http://github.com/simplegeo/python-oauth2 , кажется, охватывает то, что необходимо сделать

101
ответ дан pkqk 31 March 2013 в 16:42
поделиться

Лично я использую tweepy , он обеспечивает хорошую оболочку Python для API Twitter

-3
ответ дан Bassdread 31 March 2013 в 16:42
поделиться
Другие вопросы по тегам:

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