[英]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.