鉴于某个项目有可选的CUDA构建,如何在两个项目变体之间共享代码,以便最大化代码重用?
例如,在保证CUDA构建的项目中,可以按如下方式在项目的CPU和GPU部分之间共享代码: -
//shared_functions.h
float computeEta(float lambda, int t);
//shared_functions.cu
__host__ __device__
float computeEtaDevice(float lambda, int t){
return (1.0/(lambda*(float)t));
}
float computeEta(float lambda, int t){
return computeEtaDevice(lambda, t);
}
//test.cpp
#include "shared_functions.h"
...
computeEta(lambda, t);
但是,目前尚不清楚如何在编译时没有CUDA的情况下实现这一目标。
答案 0 :(得分:2)
所以,经过一些实验,似乎有类似的东西可以解决问题(用浏览器编写的例子): -
package com.hydester.hopefullylastcrctest;
public class Crc8 {
private static Crc8 instance;
private final byte initial = 0x00;
private final byte finalXor = 0x00;
private final boolean inputReflected = true;
private final boolean resultReflected = true;
private final int[] crcTable = new int[]{0,49,98,83,196,245,166,151,185,136,219,234,125,76,31,46,67,114,33,16,135,182,229,212,250,203,152,169,62,15,92,109,134,183,228,213,66,115,32,17,63,14,93,108,251,202,153,168,197,244,167,150,1,48,99,82,124,77,30,47,184,137,218,235,61,12,95,110,249,200,155,170,132,181,230,215,64,113,34,19,126,79,28,45,186,139,216,233,199,246,165,148,3,50,97,80,187,138,217,232,127,78,29,44,2,51,96,81,198,247,164,149,248,201,154,171,60,13,94,111,65,112,35,18,133,180,231,214,122,75,24,41,190,143,220,237,195,242,161,144,7,54,101,84,57,8,91,106,253,204,159,174,128,177,226,211,68,117,38,23,252,205,158,175,56,9,90,107,69,116,39,22,129,176,227,210,191,142,221,236,123,74,25,40,6,55,100,85,194,243,160,145,71,118,37,20,131,178,225,208,254,207,156,173,58,11,88,105,4,53,102,87,192,241,162,147,189,140,223,238,121,72,27,42,193,240,163,146,5,52,103,86,120,73,26,43,188,141,222,239,130,179,224,209,70,119,36,21,59,10,89,104,255,206,157,172};
private Crc8(){}
public static Crc8 getInstance(){
return instance == null ? instance = new Crc8() : instance;
}
public int compute(int[] bytes) {
int crc = initial;
for (int b : bytes) {
int curByte = (inputReflected ? reflect8(b) : b);
int data = (int) (curByte ^ crc);
crc = (int) (crcTable[data]);
}
crc = (resultReflected ? reflect8(crc) : crc);
return (int) (crc ^ finalXor);
}
private int reflect8(int val) {
int resByte = 0;
for (int i = 0; i < 8; i++) {
if ((val & (1 << i)) != 0) {
resByte |= (int) (1 << (7 - i));
}
}
return resByte;
}}