Skip to content

CUDA implementation #6

@MihailMuh

Description

@MihailMuh

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

global void convertIfcCodeToHex(const char* ifcCode, char* hexString) {
int idx = threadIdx.x;

if (idx < 22) {
    // Преобразуем символ в бинарное представление
    if (ifcCode[idx] >= 'A' && ifcCode[idx] <= 'Z') {
        hexString[idx] = '1';
    } else {
        hexString[idx] = '0';
    }
}

}

int main() {
char ifcCode[23]; // 22 символа + 1 для нуль-терминатора
printf("Введите код IFC (22 символа): ");
scanf("%22s", ifcCode);

if (strlen(ifcCode) != 22) {
    printf("Некорректная длина кода IFC.\n");
    return 1;
}

char* d_ifcCode;
char* d_binaryString;
char binaryString[33] = {0}; // 32 бита + 1 для нуль-терминатора
char hexString[9] = {0}; // 8 символов + 1 для нуль-терминатора

// Выделяем память на GPU
cudaMalloc((void**)&d_ifcCode, 23 * sizeof(char));
cudaMalloc((void**)&d_binaryString, 23 * sizeof(char));

// Копируем данные на GPU
cudaMemcpy(d_ifcCode, ifcCode, 23 * sizeof(char), cudaMemcpyHostToDevice);

// Запускаем ядро
convertIfcCodeToHex<<<1, 22>>>(d_ifcCode, d_binaryString);

// Копируем результат обратно на CPU
cudaMemcpy(binaryString, d_binaryString, 23 * sizeof(char), cudaMemcpyDeviceToHost);

// Заполняем оставшиеся нули до 32 бит
for (int i = 22; i < 32; i++) {
    binaryString[i] = '0';
}
binaryString[32] = '\0'; // Нуль-терминатор

// Преобразуем бинарную строку в десятичное значение
int decimalValue = (int)strtol(binaryString, NULL, 2);

// Преобразуем десятичное значение в шестнадцатеричное
sprintf(hexString, "%X", decimalValue);

printf("Шестнадцатеричное представление: %s\n", hexString);

// Освобождаем память на GPU
cudaFree(d_ifcCode);
cudaFree(d_binaryString);

return 0;

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions