diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ff9e6b1..ff20627 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -82,9 +82,9 @@ jobs: -lOpenCL \ -O3 \ -pthread \ - -march=native \ - -DCL_HPP_TARGET_OPENCL_VERSION=300 \ - -DBOINC -Iboinc/ -Lboinc/lib/lin -lcuda -lboinc_api -lboinc + -march=sandybridge \ + -DCL_HPP_TARGET_OPENCL_VERSION=200 \ + -DBOINC -Iboinc/ -Lboinc/lib/lin -lcuda -lboinc_api -lboinc -lboinc_opencl - uses: actions/upload-artifact@v4 with: @@ -97,6 +97,8 @@ jobs: steps: - uses: actions/checkout@v2 - uses: msys2/setup-msys2@v2 + with: + msystem: MSYS - name: setup run: | msys2 -c 'wget https://github.com/GPUOpen-LibrariesAndSDKs/OCL-SDK/files/1406216/lightOCLSDK.zip -O amdocl.zip' @@ -104,7 +106,7 @@ jobs: - name: build run: | echo "D:\a\diamond-ore-veins\diamond-ore-veins\lib\x86_64\;D:\a\diamond-ore-veins\diamond-ore-veins\include\" >> $GITHUB_PATH - g++ -w -static -m64 -Ofast -lstdc++ .\opencl_main.cpp -o ${{ github.event.repository.name }}-opencl.exe -LD:\a\diamond-ore-veins\diamond-ore-veins\lib\x86_64\ -ID:\a\diamond-ore-veins\diamond-ore-veins\include\ -ID:\a\diamond-ore-veins\diamond-ore-veins\boinc\ -ID:\a\diamond-ore-veins\diamond-ore-veins\boinc\win\ -LD:\a\diamond-ore-veins\diamond-ore-veins\boinc\lib\win\ -lboinc_api -lboinc -lboinc_opencl -lOpenCL -D_WIN64 -DWIN64 -D_WIN32 -DWIN32 -DCL_HPP_ENABLE_EXCEPTIONS + g++ -w -static -m64 -Ofast -lstdc++ .\opencl_main.cpp -o ${{ github.event.repository.name }}-opencl.exe -LD:\a\diamond-ore-veins\diamond-ore-veins\lib\x86_64\ -ID:\a\diamond-ore-veins\diamond-ore-veins\include\ -ID:\a\diamond-ore-veins\diamond-ore-veins\boinc\ -ID:\a\diamond-ore-veins\diamond-ore-veins\boinc\win\ -LD:\a\diamond-ore-veins\diamond-ore-veins\boinc\lib\win\ -lboinc_api -lboinc -lboinc_opencl -lOpenCL -DBOINC -D_WIN64 -DWIN64 -D_WIN32 -DWIN32 -DCL_HPP_ENABLE_EXCEPTIONS dir diff --git a/boinc/lib/win/boinc.lib b/boinc/lib/win/boinc.lib deleted file mode 100644 index 9e09565..0000000 Binary files a/boinc/lib/win/boinc.lib and /dev/null differ diff --git a/boinc/lib/win/boinc_api.lib b/boinc/lib/win/boinc_api.lib deleted file mode 100644 index 3c183b5..0000000 Binary files a/boinc/lib/win/boinc_api.lib and /dev/null differ diff --git a/boinc/lib/win/boinc_graphics2.lib b/boinc/lib/win/boinc_graphics2.lib deleted file mode 100644 index 16a181e..0000000 Binary files a/boinc/lib/win/boinc_graphics2.lib and /dev/null differ diff --git a/boinc/lib/win/boinc_opencl.lib b/boinc/lib/win/boinc_opencl.lib deleted file mode 100644 index fc1a998..0000000 Binary files a/boinc/lib/win/boinc_opencl.lib and /dev/null differ diff --git a/boinc/lib/win/libboinc.a b/boinc/lib/win/libboinc.a new file mode 100644 index 0000000..539b417 Binary files /dev/null and b/boinc/lib/win/libboinc.a differ diff --git a/boinc/lib/win/libboinc_api.a b/boinc/lib/win/libboinc_api.a new file mode 100644 index 0000000..abf9ecf Binary files /dev/null and b/boinc/lib/win/libboinc_api.a differ diff --git a/boinc/lib/win/libboinc_graphics2.a b/boinc/lib/win/libboinc_graphics2.a new file mode 100644 index 0000000..d284dc3 Binary files /dev/null and b/boinc/lib/win/libboinc_graphics2.a differ diff --git a/boinc/lib/win/libboinc_opencl.a b/boinc/lib/win/libboinc_opencl.a new file mode 100644 index 0000000..2bbc0e3 Binary files /dev/null and b/boinc/lib/win/libboinc_opencl.a differ diff --git a/build.sh b/build.sh index 5689b98..df578db 100755 --- a/build.sh +++ b/build.sh @@ -5,6 +5,6 @@ g++ -o cl opencl_main.cpp -lOpenCL \ -O3 \ - -march=native \ - -DCL_HPP_TARGET_OPENCL_VERSION=300 \ - -DBOINC -Iboinc/ -Lboinc/lib/lin -lcuda -lboinc_api -lboinc \ No newline at end of file + -march=sandybridge \ + -DCL_HPP_TARGET_OPENCL_VERSION=200 \ + -Iboinc/ -Lboinc/lib/lin -lcuda -lboinc_api -lboinc_opencl -lboinc \ No newline at end of file diff --git a/main.cu b/main.cu index 0f101e0..d268400 100644 --- a/main.cu +++ b/main.cu @@ -12,6 +12,7 @@ #include #ifdef BOINC +#include "boinc_opencl.h" #include "boinc_api.h" #if defined _WIN32 || defined _WIN64 #include "boinc_win.h" diff --git a/opencl_main.cpp b/opencl_main.cpp index 944053b..c4640fb 100644 --- a/opencl_main.cpp +++ b/opencl_main.cpp @@ -35,6 +35,7 @@ using namespace std::chrono; #ifdef BOINC #include "boinc_api.h" + #include "boinc_opencl.h" #if defined _WIN32 || defined _WIN64 #include "boinc_win.h" #endif @@ -161,13 +162,6 @@ inline float rng_next_float(__private RNG *rng) { return xNextFloat(&rng->internal); } -inline double rng_next_double(__private RNG *rng) { - int i = (int)rng_next(rng, 26); - int j = (int)rng_next(rng, 27); - u64 k = ((u64)i << 27) + (u64)j; - return (double)k * 1.110223e-16; -} - inline int rng_next_between_inclusive(__private RNG *rng, int i, int j) { return rng_next_int(rng, (u32)(j - i + 1)) + i; } @@ -282,7 +276,8 @@ __kernel void seed_kernel(u64 offset, __global u64 *out, volatile __global u32 * (void)rng_next_int(&rng, 3); (void)rng_next_int(&rng, 3); for (int j = 0; j < 8; j++) { - (void)rng_next_double(&rng); + (void)rng_next(&rng, 26); + (void)rng_next(&rng, 26); } } @@ -295,12 +290,22 @@ int main(int argc, char **argv) { uint64_t block_min = 0; uint64_t block_max = 0; uint64_t checked = 0; - int device = 0; + cl_device_id cl_device = 0; + cl_platform_id platform = 0; + cl_int err; + + int non_boinc_device = 0; + int non_boinc_platform = 0; + for (int i = 1; i < argc; i += 2) { const char *param = argv[i]; if (strcmp(param, "-d") == 0 || strcmp(param, "--device") == 0) { - device = atoi(argv[i + 1]); - } else if (strcmp(param, "-s") == 0 || strcmp(param, "--start") == 0) { + sscanf(argv[i + 1], "%llu", &non_boinc_device); + } + else if (strcmp(param, "-p") == 0 || strcmp(param, "--platform") == 0) { + sscanf(argv[i + 1], "%llu", &non_boinc_platform); + } + else if (strcmp(param, "-s") == 0 || strcmp(param, "--start") == 0) { sscanf(argv[i + 1], "%llu", &block_min); } else if (strcmp(param, "-e") == 0 || strcmp(param, "--end") == 0) { sscanf(argv[i + 1], "%llu", &block_max); @@ -320,33 +325,20 @@ int main(int argc, char **argv) { boinc_init_options(&options); APP_INIT_DATA aid; boinc_get_init_data(aid); - if (aid.gpu_device_num >= 0) { - //If BOINC client provided us a device ID - device = aid.gpu_device_num; - fprintf(stderr,"boinc gpu %i gpuindex: %i \n", aid.gpu_device_num, device); - } else { - //If BOINC client did not provide us a device ID - device = -5; - for (int i = 1; i < argc; i += 2) { - //Check for a --device flag, just in case we missed it earlier, use it if it's available. For older clients primarily. - if(strcmp(argv[i], "--device") == 0){ - sscanf(argv[i + 1], "%i", &device); - } - - } - if(device == -5){ - //Something has gone wrong. It pulled from BOINC, got -1. No --device parameter present. - fprintf(stderr, "Error: No --device parameter provided! Defaulting to device 0...\n"); - device = 0; - } - fprintf(stderr,"stndalone gpuindex %i (aid value: %i)\n", device, aid.gpu_device_num); - } + int retval = boinc_get_opencl_ids(&cl_device, &platform); + if (retval != CL_SUCCESS) { + fprintf(stderr, "Error occurred obtaining opencl_ids from boinc: %d\n", err); + } + if (cl_device != nullptr && platform != nullptr) { + //If BOINC client provided us a device ID + fprintf(stderr, "boinc gpu %i platform: %i \n", cl_device, platform); + } + FILE *checkpoint_data = boinc_fopen("checkpoint.txt", "rb"); if(!checkpoint_data){ //No checkpoint file was found. Proceed from the beginning. fprintf(stderr, "No checkpoint to load\n"); - } else{ //Load from checkpoint. You can put any data in data_store that you need to keep between runs of this program. @@ -359,53 +351,57 @@ int main(int argc, char **argv) { fclose(checkpoint_data); boinc_end_critical_section(); } - #endif - // cudaSetDevice(device); - // opencl setup start - - cl_int err; - - std::vector all_platforms; - err = cl::Platform::get(&all_platforms); - if (err != CL_SUCCESS) { - fprintf(stderr, "OpenCL error: %d\n", err); - exit(1); - } + cl::Device device(cl_device); + #else + std::vector all_platforms; + err = cl::Platform::get(&all_platforms); + if (err != CL_SUCCESS) { + fprintf(stderr, "OpenCL error: %d\n", err); + exit(1); + } - if (all_platforms.size() < 1) { - fprintf(stderr, "No OpenCL platform found!\n"); - exit(1); - } + if (all_platforms.size() < 1) { + fprintf(stderr, "No OpenCL platform found!\n"); + exit(1); + } - std::vector all_devices; - err = all_platforms[0].getDevices(CL_DEVICE_TYPE_ALL, &all_devices); - if (err != CL_SUCCESS) { - fprintf(stderr, "OpenCL error: %d\n", err); - exit(1); - } + std::vector all_devices; + err = all_platforms[non_boinc_platform].getDevices(CL_DEVICE_TYPE_ALL, &all_devices); + if (err != CL_SUCCESS) { + fprintf(stderr, "OpenCL error: %d\n", err); + exit(1); + } - if (all_devices.size() < 1) { - fprintf(stderr, "No OpenCL device found!\n"); - exit(1); - } + if (all_devices.size() < 1) { + fprintf(stderr, "No OpenCL device found!\n"); + exit(1); + } - cl::Device cl_device; + cl::Device device = all_devices[non_boinc_device]; + #endif + // cudaSetDevice(device); + // opencl setup start + printf("starting...\n"); + cl::Context ctx; cl::Program program; - cl_device = all_devices[device]; - ctx = cl::Context({cl_device}); + // cl_device = all_devices[device]; + ctx = cl::Context({device}); cl::Program::Sources sources; sources.push_back({kernel_source, strlen(kernel_source)}); program = cl::Program(ctx, sources); - err = program.build({cl_device}); + err = program.build({device}); if (err != CL_SUCCESS) { + std::string buildLog = program.getBuildInfo(device); + std::cerr << "Build Log:\n" << buildLog << std::endl; + fprintf(stderr, "OpenCL error: %d\n", err); exit(1); } - cl::CommandQueue queue(ctx, cl_device); + cl::CommandQueue queue(ctx, device); cl::Buffer cl_out(ctx, CL_MEM_READ_WRITE, sizeof(uint64_t) * 512); cl::Buffer result_count(ctx, CL_MEM_READ_WRITE, sizeof(uint32_t));