Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
BF extended 2022
Avatar
Caster
Člen
Avatar
Caster:27. října 22:33

Pokouším se opravit kód funkce v Linuxu na Windows:

__constant__ BYTE characterSet[63] = {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"};

__global__ void sha256_cuda(BYTE *prefix, BYTE *solution, int *blockContainsSolution, unsigned long baseSeed) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    SHA256_CTX ctx;
    BYTE digest[32];
    BYTE random[RANDOM_LEN];
    unsigned long seed = baseSeed;
    seed += (unsigned long) i;
    for (int j = 0; j < RANDOM_LEN; j++) {
        seed = deviceRandomGen(seed);
        int randomIdx = (int) (seed % 62);
        random[j] = characterSet[randomIdx];
    }
    sha256_init(&ctx);
    sha256_update(&ctx, prefix, TEXT_LEN);
    sha256_update(&ctx, random, RANDOM_LEN);
    sha256_final(&ctx, digest);
    for (int j = 0; j < DIFFICULTY; j++)
        if (digest[j] > 0)
            return;
    if ((digest[DIFFICULTY] & 0xF0) > 0)
        return;
    if (*blockContainsSolution == 1)
        return;
    *blockContainsSolution = 1;
    for (int j = 0; j < RANDOM_LEN; j++)
        solution[j] = random[j];
}

Zkusil jsem: Ve Windows jsem upravil na:

__constant__ BYTE characterSet[63] = { "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" };

__global__ void sha256_cuda(BYTE* prefix, BYTE* solution, int* blockContainsSolution, uint64_t baseSeed) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    SHA256_CTX ctx;
    BYTE digest[32];
    BYTE random[RANDOM_LEN];
    uint64_t seed = baseSeed;
    seed += (uint64_t)i;
    for (int j = 0; j < RANDOM_LEN; j++) {
        seed = deviceRandomGen(seed);
        int randomIdx = (int)(seed % 62);
        random[j] = characterSet[randomIdx];
    }
    sha256_init(&ctx);
    sha256_update(&ctx, prefix, TEXT_LEN);
    sha256_update(&ctx, random, RANDOM_LEN);
    sha256_final(&ctx, digest);
    for (int j = 0; j < DIFFICULTY; j++)
        if (digest[j] > 0)
            return;
    if ((digest[DIFFICULTY] & 0xF0) > 0)
        return;
    if (*blockContainsSolution == 1)
        return;
    *blockContainsSolution = 1;
    for (int j = 0; j < RANDOM_LEN; j++)
        solution[j] = random[j];
}
void hostRandomGen(uint64_t* x) {
    *x ^= (*x << 21);
    *x ^= (*x >> 35);
    *x ^= (*x << 4);
}

Chci docílit: Abych správně předal parametry fukci, která se volá z main:

hostRandomGen(&rngSeed);
sha256_cuda << <THREADS, BLOCKS >> > (d_prefix, d_solution, d_blockContainsSolution, rngSeed);

Při ladění a zastavení programu před provedením funkce po najetí myší na d_prefix, d_solution Visual Studio dostanu chybové hlášení: Při čtení znaků řetězce se stala chyba (nejde přečíst paměť)

Myslím si, že je zádrhel v definici BYTE, neměl bych použít spíše char ?

 
Odpovědět
27. října 22:33
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:27. října 23:20

Z toho co uvádíš lze těžko říci že vše předáváš správně. Neposkytuješ totiž deklarace argumentů volané funkce - d_prefix, d_solution, d_blockContain­sSolution, rngSeed.

Když se podíváš na prototyp funkce:

void sha256_cuda(BYTE *prefix, BYTE *solution, int *blockContainsSolution, unsigned long baseSeed)

TYP *identifikator - může značit ukazatel na pole typu TYP nebo ukazatel na proměnnou, kde do proměnné pod identifikátorem se vrací hodnota z funkce. Podíváš-li se na tělo funkce tak zjistíš že:

první parametr je pro pole
druhý parametr je pro pole
třetí parametr je pro proměnnou, do které vracíš hodnotu z pole
čtvrtý parametr je proměnná, kterou neměníš

Dále když se podíváš na prototyp funkce pod windows

void sha256_cuda(BYTE* prefix, BYTE* solution, int* blockContainsSolution, uint64_t baseSeed)

Tak zjistíš, že poslední parametr se liší. uint64_t rozhodně neodpovídá typu unsigned long, který je menší, ale unsigned long long. Vnímej v jakém bitovém systému se nacházíš.

Co se týká BYTE, není nic jednoduššího než se podívat jak je deklarováno pomocí typedef.

Zkontroluj si také, jak a co do proměnných d_prefix, d_solution, d_blockContain­sSolution, rngSeed ukládáš.

Nahoru Odpovědět
27. října 23:20
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Avatar
Caster
Člen
Avatar
Odpovídá na DarkCoder
Caster:28. října 0:28

Začnu od konce. uint64_t jsem myslím změnil správně protože je délka proměnné v Linuxu unisgned long = 8 bytů. Bez změny na uint64_t mi to ve Windows vyházelo x chyb (mj. i u x ^= (x >> 35);), protože ve Windows je unsigned long jen 4 byty.

v sha256.cud je:

/**************************** DATA TYPES ****************************/
typedef unsigned char BYTE;             // 8-bit byte
//typedef uint32_t  DWORD;             // 32-bit word, change to "long" for 16-bit machines

typedef struct {
        BYTE data[64];
        DWORD datalen;
        unsigned long long bitlen;
        DWORD state[8];
} SHA256_CTX;

__constant__ DWORD dev_k[64];

static const DWORD host_k[64] = {
        0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
        0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
        0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
        0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
        0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
        0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
        0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
        0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
};

To DWORD jsem musel okomentovat, protože mi to hlásilo chybu dvojí deklarace "invalid redeclaration of type name "DWORD". Ve Windows je DWORD již standardně definováno. Kliknutím na náhled definice odkazuje na řádek 156 typedef unsigned long DWORD; v souboru minwindef.h

 
Nahoru Odpovědět
28. října 0:28
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.