带有CUDA的ROT13-将字符数组传递到内核

带有CUDA的ROT13-将字符数组传递到内核,cuda,Cuda,我试图用CUDA制作一些ROT13编码器,但我在将字符数组传递到内核时遇到了问题。谁能告诉我我做错了什么 #include <iostream> #include <conio.h> #include <string> #include <cuda.h> #define CIPHER_NUMBER 13 using namespace std; __global__ void ROT13(char* text, int length) {

我试图用CUDA制作一些ROT13编码器,但我在将字符数组传递到内核时遇到了问题。谁能告诉我我做错了什么

#include <iostream>
#include <conio.h>
#include <string>
#include <cuda.h>
#define CIPHER_NUMBER 13

using namespace std;

__global__ void ROT13(char* text, int length)
{
    for (unsigned int i = 0; i < length; i++)
    {
        if ((text[i] >= 'A' && text[i] <= 'M') || (text[i] >= 'a' && text[i] <= 'm'))
            text[i] += CIPHER_NUMBER;
        else if ((text[i] >= 'N' && text[i] <= 'Z') || (text[i] >= 'n' && text[i] <= 'z'))
            text[i] -= CIPHER_NUMBER;
    }
}

int main()
{
    char* text = "Hello world!";
    char* d_text;
    cudaMalloc(&d_text, sizeof(char*));
    cudaMemcpy(d_text, &text, sizeof(char*), cudaMemcpyHostToDevice);
    ROT13 <<<1, 1>>>(d_text, 12);
    cudaMemcpy(&text, d_text, sizeof(char*), cudaMemcpyDeviceToHost);
    cout << "The answer is: " << text << endl;
    cudaFree(d_text);
    getch();
    return 0;
}
#包括
#包括
#包括
#包括
#定义密码\u编号13
使用名称空间std;
__全局无效ROT13(字符*文本,整数长度)
{
for(无符号整数i=0;i如果((text[i]>='A'&&text[i]='A'&&text[i]='N'&&text[i]='N'&&text[i]如果您在使用CUDA代码时遇到问题,您应该使用
CUDA memcheck
运行代码,并使用

无论如何,您对字符数组的使用在几个方面是错误的

主要问题是,您没有将指针从主机复制到设备,而是复制了一个字符串。该字符串的长度为12个字符,而不是
sizeof(char*)
,后者等于8

以下代码修复了这些问题:

$ cat t1179.cu
#include <iostream>
#include <string>
#define CIPHER_NUMBER 13

using namespace std;

__global__ void ROT13(char* text, int length)
{
    for (unsigned int i = 0; i < length; i++)
    {
        if ((text[i] >= 'A' && text[i] <= 'M') || (text[i] >= 'a' && text[i] <= 'm'))
            text[i] += CIPHER_NUMBER;
        else if ((text[i] >= 'N' && text[i] <= 'Z') || (text[i] >= 'n' && text[i] <= 'z'))
            text[i] -= CIPHER_NUMBER;
    }
}

int main()
{
    char text[] = "Hello world!";
    char* d_text;
    cudaMalloc(&d_text, 12*sizeof(char));
    cudaMemcpy(d_text, text, 12*sizeof(char), cudaMemcpyHostToDevice);
    ROT13 <<<1, 1>>>(d_text, 12);
    cudaMemcpy(text, d_text, 12*sizeof(char), cudaMemcpyDeviceToHost);
    cout << "The answer is: " << text << endl;
    cudaFree(d_text);
    return 0;
}
$ nvcc -o t1179 t1179.cu
$ cuda-memcheck ./t1179
========= CUDA-MEMCHECK
The answer is: Uryyb jbeyq!
========= ERROR SUMMARY: 0 errors
$
$cat t1179.cu
#包括
#包括
#定义密码\u编号13
使用名称空间std;
__全局无效ROT13(字符*文本,整数长度)
{
for(无符号整数i=0;i如果((text[i]>='A'&&text[i]='A'&&text[i]='N'&&text[i]='N'&&text[i]如果您在使用CUDA代码时遇到问题,您应该使用
CUDA memcheck
运行代码,并使用

无论如何,您对字符数组的使用在几个方面是错误的

主要问题是,您没有将指针从主机复制到设备,而是复制了一个字符串。该字符串的长度为12个字符,而不是
sizeof(char*)
,后者等于8

以下代码修复了这些问题:

$ cat t1179.cu
#include <iostream>
#include <string>
#define CIPHER_NUMBER 13

using namespace std;

__global__ void ROT13(char* text, int length)
{
    for (unsigned int i = 0; i < length; i++)
    {
        if ((text[i] >= 'A' && text[i] <= 'M') || (text[i] >= 'a' && text[i] <= 'm'))
            text[i] += CIPHER_NUMBER;
        else if ((text[i] >= 'N' && text[i] <= 'Z') || (text[i] >= 'n' && text[i] <= 'z'))
            text[i] -= CIPHER_NUMBER;
    }
}

int main()
{
    char text[] = "Hello world!";
    char* d_text;
    cudaMalloc(&d_text, 12*sizeof(char));
    cudaMemcpy(d_text, text, 12*sizeof(char), cudaMemcpyHostToDevice);
    ROT13 <<<1, 1>>>(d_text, 12);
    cudaMemcpy(text, d_text, 12*sizeof(char), cudaMemcpyDeviceToHost);
    cout << "The answer is: " << text << endl;
    cudaFree(d_text);
    return 0;
}
$ nvcc -o t1179 t1179.cu
$ cuda-memcheck ./t1179
========= CUDA-MEMCHECK
The answer is: Uryyb jbeyq!
========= ERROR SUMMARY: 0 errors
$
$cat t1179.cu
#包括
#包括
#定义密码\u编号13
使用名称空间std;
__全局无效ROT13(字符*文本,整数长度)
{
for(无符号整数i=0;i如果((文本[i]>='A'&文本[i]='A'&文本[i]='N'&文本[i]='N'&文本[i]='N'&文本[i]为什么你认为你做错了什么?你遇到了什么问题?哪些错误等。附加信息添加到帖子中。为什么你认为你做错了什么?你遇到了什么问题?哪些错误等。附加信息添加到帖子中。