繁体   English   中英

OpenCL 简单矩阵乘法未返回正确结果

[英]OpenCL simple matrix multiplication not returning proper results

我正在尝试使用 OpenCL 与 c++ 主机相乘 2 个方阵 (32x32)。 我正在尝试从一本书(OpenCL Programming By Example - R Banger,K Bhattacharyya)和这里的基础中复制结果。 然而,结果是错误的。 我检查了代码的所有部分,并推断“enqueueNDRangeKernel”似乎设置错误。 谁能帮我解决这个瓶颈? 我使用的是 NVIDIA MX250 显卡,但我猜这个代码是在集成的 Intel GPU 上运行的。 这是代码:

#pragma comment(lib, "OpenCL.lib")

#include <iostream>
#include <CL/cl.hpp>
#include <vector>
#include <chrono>

using namespace std;

int main()
{
    int i;
    int dim = 1024;
    float* A = (float*)malloc(sizeof(float) * dim * dim);
    float* B = (float*)malloc(sizeof(float) * dim * dim);
    float* C = (float*)malloc(sizeof(float) * dim * dim);
    for (i = 0; i < dim * dim; i++)
    {
        A[i] = (float)(rand() % 10);
        B[i] = (float)(rand() % 10);
        C[i] = 0;
    }

    //get all platforms (drivers)
    std::vector<cl::Platform> all_platforms;
    cl::Platform::get(&all_platforms);
    if (all_platforms.size() == 0) {
        std::cout << " No platforms found. Check OpenCL installation!\n";
        exit(1);
    }
    cl::Platform default_platform = all_platforms[0];
    std::cout << "Using platform: " << default_platform.getInfo<CL_PLATFORM_NAME>() << "\n";

    //get default device of the default platform
    std::vector<cl::Device> all_devices;
    default_platform.getDevices(CL_DEVICE_TYPE_ALL, &all_devices);
    if (all_devices.size() == 0) {
        std::cout << " No devices found. Check OpenCL installation!\n";
        exit(1);
    }
    cl::Device default_device = all_devices[0];
    std::cout << "Using device: " << default_device.getInfo<CL_DEVICE_NAME>() << "\n";


    cl::Context context({ default_device });

    cl::Program::Sources sources;

    // kernel calculates for each element C=A+B
    std::string kernel_code =
        "   void kernel simple_add(global const float* A, global const float* B, global float* C, int dim){       "
        "       int iCol = get_global_id(0);                            "
        "       int iRow = get_global_id(1);                            "
        "       float result = 0.0;                                     "
        "       for (int i = 0; i < dim; ++i) "
        "       { "
        "           result += A[iRow * dim + i] * B[i * dim + iCol]; "
        "       }   "
        "           "
        "       C[iRow * dim + iCol] = result; "
        "   }                                                                               ";

    sources.push_back({ kernel_code.c_str(),kernel_code.length() });

    cl::Program program(context, sources);
    if (program.build({ default_device }) != CL_SUCCESS) {
        std::cout << " Error building: " << program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(default_device) << "\n";
        exit(1);
    }


    // create buffers on the device
    cl::Buffer buffer_A(context, CL_MEM_READ_WRITE, sizeof(int) * dim);
    cl::Buffer buffer_B(context, CL_MEM_READ_WRITE, sizeof(int) * dim);
    cl::Buffer buffer_C(context, CL_MEM_READ_WRITE, sizeof(int) * dim);

    //create queue to which we will push commands for the device.
    cl::CommandQueue queue(context, default_device);

    //write arrays A and B to the device
    queue.enqueueWriteBuffer(buffer_A, CL_TRUE, 0, sizeof(float) * dim, A);
    queue.enqueueWriteBuffer(buffer_B, CL_TRUE, 0, sizeof(float) * dim, B);

    //run the kernel

    cl::Kernel simple_add(program, "simple_add");
    simple_add.setArg(0, buffer_A);
    simple_add.setArg(1, buffer_B);
    simple_add.setArg(2, buffer_C);
    simple_add.setArg(3, dim);

    cl::NDRange global(32, 32);

    queue.enqueueNDRangeKernel(simple_add, cl::NullRange, global, cl::NullRange);
    queue.finish();

    //  float C[10];
        //read result C from the device to array C
    queue.enqueueReadBuffer(buffer_C, CL_TRUE, 0, sizeof(float) * dim, C);

    for (int i = 0; i < dim; i++) {
        std::cout << C[i] << " ";
        C[i] = 0.0;
    }
}

我终于可以找到错误了。问题是我传递了 dim = 1024,即线性化矩阵(向量)的长度。 应该是 32。以防万一它在将来的某个时候对某人有所帮助。 感谢所有观看尝试回答的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM