我想要做的是在设备中处理两个字符串并在主机上调用。我收到一个错误,告诉我不允许从全局调用主机功能。考虑到这一点,我将如何重新构建此代码,以便它通过设备运行?
__global__ void whatever(string *x, string *y){
*x += *y;}
int main(){
string x, y, *x_in, *y_in;
x = "Hello ";
y = "World!\n";
cudaMalloc((void**)&x_in, sizeof(int));
cudaMalloc((void**)&y_in, sizeof(int));
cudaMemcpy(x_in, &x, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(y_in, &y, sizeof(int), cudaMemcpyHostToDevice);
whatever << <1, 1 >> > (x_in, y_in);
cudaMemcpy(&x, x_in, sizeof(int), cudaMemcpyDeviceToHost);
cudaMemcpy(&y, y_in, sizeof(int), cudaMemcpyDeviceToHost);
cudaFree(&x_in);
cudaFree(&y_in);
cout << x;
return 0; }
答案 0 :(得分:0)
回答你的问题:你打电话给*x += *y;
,我。即std::string
个对象的连接和赋值操作(显然只定义为STL中的主机函数)。
关于重组 - 你可以传递给设备char*
缓冲区(当然,在设备上分配)而不是字符串对象并使用它们。
关于代码的更多要点:
sizeof(int)
个字节,为什么?我看到你的数据超过4个字节; sizeof(int)
个字节,为什么?<< <1, 1> >>
语法而不是<<<1, 1,>>>
(我相信这只是在此处复制粘贴代码后的格式问题);