gpt4 book ai didi

c++ - 如何将字符串传递给 GPU 并从内核中取回以显示它? (C++ OpenCL)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:49 24 4
gpt4 key购买 nike

我想将一个字符串传递到我的 GPU 并从 GPU 取回它以打印它。这是为了理解目的 - 我知道,这个想法听起来毫无意义。

我试过:

OpenCL:

__kernel void same_in_same_out_char(__global uchar * out, __constant uchar * in){
for (unsigned int ui=0; ui<3; ui++) out[ui]=in[ui];
}

C++:

#define __CL_ENABLE_EXCEPTIONS

#include <fstream>
#include <iostream>
#include <iterator>
#include <CL/cl.hpp>
#include <CL/opencl.h>


using namespace std;
int main () {

vector<cl::Platform> platforms;
vector<cl::Device> devices;
vector<cl::Kernel> kernels;

try {

// create platform
cl::Platform::get(&platforms);
platforms[0].getDevices(CL_DEVICE_TYPE_GPU, &devices);

// create context
cl::Context context(devices);

// create command queue
cl::CommandQueue queue(context, devices[0]);

// load opencl source
ifstream cl_file("inout.cl");
string cl_string(istreambuf_iterator<char>(cl_file), (istreambuf_iterator<char>()));
cl::Program::Sources source(1, make_pair(cl_string.c_str(),
cl_string.length() + 1));

// create program
cl::Program program(context, source);

// compile opencl source
program.build(devices);

// load named kernel from opencl source
cl::Kernel kernel(program, "same_in_same_out_char");

// create a message to send to kernel
const char pwd[] = "MAX";
cout << "char pwd[] : " << pwd << endl;
cl_uchar * password = (cl_uchar*) &pwd;
int bufferA_size = 3; // array size is 3

int bufferC_size = 3; // array size is 3
cout << " -- OpenCL -- " << endl;

// allocate device buffer to hold message
cl::Buffer bufferA(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uchar) * bufferA_size, password);
cl::Buffer bufferC(context, CL_MEM_WRITE_ONLY, sizeof(cl_uchar) * bufferC_size);

// set message as kernel argument
kernel.setArg(0, bufferC);
kernel.setArg(1, bufferA);

// execute kernel
queue.enqueueTask(kernel);

// wait for completion
queue.finish();
// ----------------------

cl_uint out_global[bufferC_size];
queue.enqueueReadBuffer(bufferC, CL_TRUE, 0, bufferC_size*sizeof(cl_uchar), &out_global);

cout << "Output \t\t:" << *out_global << endl << "Output[1..n] \t:";
for (unsigned int i=0; i<bufferC_size; i ++) cout << out_global[i] << " " ;

cout << endl;
} catch (cl::Error e) {
cout << endl << e.what() << " : " << e.err() << endl;
}

return 0;

}

但是我失败了。输出是

Output :5783885

Output[1..n] :5783885 0 26

但不是

MAXor77 65 88

(对于 M A X)。

注意,马库斯

最佳答案

如果事实给了您期望的答案,但您将其放入了错误的数据类型。

您得到的是单个整数5783885,即0x0058414D(十六进制)。您使用的是小端平台,因此这些字节排列在从低位到高位的内存,即如果你查看内存,字节将是(仍然是十六进制):

4D, 41, 58, 00, ...

这些,以十进制显示将是:

77, 65, 88, 0, ...

换句话说,正是您所期望的。

您的问题(至少是您的问题之一)是您将 out_global 声明为 cl_uint 数组,而不是 cl_ucharcl_char 或其他东西。

所以更改以下行,您可能会没事。

cl_uint out_global[bufferC_size];

关于c++ - 如何将字符串传递给 GPU 并从内核中取回以显示它? (C++ OpenCL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17515774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com